возратить список из функции

  • Автор темы azzzza
  • Дата начала
A

azzzza

Гость
#1
Собственно, сабж. Язык - LotusScript
В функции формирую определенный список и не знаю, каким образом можно его вернуть.
Функция такова. Хочу, чтобы возвращала сформированый список MainTasks
Код:
Function GetMainTaskList()
Dim session As New NotesSession	
Set db = session.CurrentDatabase	
Set view = db.GetView( "******" )
Set doc = view.GetFirstDocument
i = 0
While Not (doc Is Nothing)
Set item = doc.GetFirstItem( "****" )
MainTasks(i) = item.text
i=i+1
' Messagebox item.text
Set doc = view.GetNextDocument(doc)
Wend
Set GetMainTaskList = MainTasks
End Function
Вызываю функцию так
Код:
Dim MainTasks List As String
Set MainTasks = ListGetMainTaskList()
Я так понимаю, что функция возвращает мне тип Variant. А как поставить, чтобы список я не знаю. Возможно ли что-то вроде
Код:
Function GetMainTaskList() As List
или
Код:
Function GetMainTaskList() As List As String
 

hosm

* so what *
18.05.2009
2 442
9
#2
гм, если судить по коду, так тут вообще смысла в списках и задания Set для результата ф-ции нет, если у вас ключ списка - индекс документа в представлении, формируйте просто в результате массив Variant и обрабатывайте по индексу. Список можно тоже вернуть через Variant.
А Set - это для объектов используется, для обычных переменных - Let, который можно опустить...
 

morpheus

скриптописец
07.08.2006
3 915
1
#3
azzzza
variant вполне подойдёт, разве что будет необзодима доп. проверка.

Возможно, стоит нарисовать свой класс и через NEW собирать нужные данные.

Код:
Class MyList
Count As Integer
MainTasks List As String

Sub new()
Me.Count = 0
Dim session As New NotesSession	
Set db = session.CurrentDatabase	
Set view = db.GetView( "******" )
Set doc = view.GetFirstDocument
i = 0
While Not (doc Is Nothing)
Me.MainTasks(i) = doc.GetItemValue( "****" )(0)
i=i+1
Set doc = view.GetNextDocument(doc)
Wend
Me.Count = i
End Sub
End Class
вызов и будет
Код:
Dim MainTasks as MyList
Set MainTasks = New MyList
if MainTasks.Count = 0 then ... ' ничего нету
набросал тут, могут быть помарки
 
13.03.2009
625
2
#4
В функции формирую определенный список и не знаю, каким образом можно его вернуть.
Я так понимаю, что функция возвращает мне тип Variant. А как поставить, чтобы список я не знаю. Возможно ли что-то вроде
Код:
Function GetMainTaskList() As List
или
Код:
Function GetMainTaskList() As List As String
К сожалению, список вернуть нельзя. Тут явно недоработка индусов. Придется возвращать либо Variant, либо написать обертку для списка.
А еще можно взять вариант Morpheus и сделать поле класса публичным. Оно конечно не очень правильно, зато работает.

Я как-то заморачивался на подобные конструкции:
Код:
' Usage:
'	Dim iterator As New MainTaskIterator
'	While iterator.hasNext()
'		Dim task As MainTask
'		Set task = iterator.getNext()
'		' do something with task... 
'	Wend

Class MainTaskIterator
Private taskList List As MainTask
Private count As Integer
Private current As Integer

Sub new()
' compose list....
current = 0
End Sub

Public Function hasNext() As Boolean
hasNext = ( current < count )
End Function

Public Function getNext() As MainTask
Set getNext = taskList( current )
current = current + 1
End Function
End Class
Оно вроде тоже работает, но по жизни - не всегда удобно, т.к. иногда реально хочется поиметь на выходе типизированный список.
В некоторых случаях, проще вообще не отдавать список наружу, а реализовывать операции над списком в виде методов класса, инкапсулирующего этот список.
Короче - прямого решения нет, ищите workaround.
 

VladSh

начинающий
Lotus team
11.12.2009
1 248
2
#5
Если всё-таки Variant, то проще так:
Код:
Function GetMainTaskList()
Dim MainTasks List As ...
...
...
Set GetMainTaskList = MainTasks
End Function
Использование:
Код:
Dim Tasks As Variant
Set Tasks = ListGetMainTaskList()
Если очень нужна типизация в вызывающей функции, то параметром:
Код:
Function GetMainTaskList(MainTasks As Variant) As Boolean
GetMainTaskList = True	'если что-то было добавлено
End Function
Использование:
Код:
Dim MainTasks List As String
If ListGetMainTaskList(MainTasks) Then
...	'что-то делаем
End If
Но самый правильный способ это тот, что предлагали Morpheus и turumbay, но его я бы использовал там, где планируется/возможно повторное использование этого класса (у меня парочку классов-списков есть, но надо точно знать, зачем оно надо, и какие плюсы это несёт, т.к. есть и минусы).
 
A

azzzza

Гость
#6
Всем спасибо за ответы с кодом и разжевыванием.
Думаю, мне больше всего подойдет вариант предложеный Morpheus и при необходимости turumbay.