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

Тема в разделе "Lotus - Программирование", создана пользователем azzzza, 4 май 2011.

  1. azzzza

    azzzza Гость

    Репутация:
    0
    Собственно, сабж. Язык - 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
     
  2. hosm

    hosm * so what *

    Репутация:
    0
    Регистрация:
    18 май 2009
    Сообщения:
    2.442
    Симпатии:
    8
    гм, если судить по коду, так тут вообще смысла в списках и задания Set для результата ф-ции нет, если у вас ключ списка - индекс документа в представлении, формируйте просто в результате массив Variant и обрабатывайте по индексу. Список можно тоже вернуть через Variant.
    А Set - это для объектов используется, для обычных переменных - Let, который можно опустить...
     
  3. morpheus

    morpheus скриптописец

    Репутация:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    3.915
    Симпатии:
    1
    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 ... ' ничего нету
    набросал тут, могут быть помарки
     
  4. turumbay

    Репутация:
    0
    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    К сожалению, список вернуть нельзя. Тут явно недоработка индусов. Придется возвращать либо 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.
     
  5. VladSh

    VladSh начинающий
    Lotus team

    Репутация:
    0
    Регистрация:
    11 дек 2009
    Сообщения:
    1.248
    Симпатии:
    2
    Если всё-таки 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, но его я бы использовал там, где планируется/возможно повторное использование этого класса (у меня парочку классов-списков есть, но надо точно знать, зачем оно надо, и какие плюсы это несёт, т.к. есть и минусы).
     
  6. azzzza

    azzzza Гость

    Репутация:
    0
    Всем спасибо за ответы с кодом и разжевыванием.
    Думаю, мне больше всего подойдет вариант предложеный Morpheus и при необходимости turumbay.
     
Загрузка...

Поделиться этой страницей