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

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

  1. azzzza

    azzzza Гость

    Собственно, сабж. Язык - LotusScript
    В функции формирую определенный список и не знаю, каким образом можно его вернуть.
    Функция такова. Хочу, чтобы возвращала сформированый список MainTasks
    Код (LotusScript):
    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
    Вызываю функцию так
    Код (LotusScript):
    Dim MainTasks List As String
    Set MainTasks = ListGetMainTaskList()
    Я так понимаю, что функция возвращает мне тип Variant. А как поставить, чтобы список я не знаю. Возможно ли что-то вроде
    Код (LotusScript):
    Function GetMainTaskList() As List
    или
    Код (LotusScript):
    Function GetMainTaskList() As List As String
     
  2. hosm

    hosm * so what *

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

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

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    azzzza
    variant вполне подойдёт, разве что будет необзодима доп. проверка.

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

    Код (LotusScript):
    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
    вызов и будет
    Код (LotusScript):
    Dim MainTasks as MyList
    Set MainTasks = New MyList
    if MainTasks.Count = 0 then ... ' ничего нету
    набросал тут, могут быть помарки
     
  4. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    К сожалению, список вернуть нельзя. Тут явно недоработка индусов. Придется возвращать либо Variant, либо написать обертку для списка.
    А еще можно взять вариант Morpheus и сделать поле класса публичным. Оно конечно не очень правильно, зато работает.

    Я как-то заморачивался на подобные конструкции:
    Код (Text):
    ' 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

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Если всё-таки Variant, то проще так:
    Код (Text):
    Function GetMainTaskList()
    Dim MainTasks List As ...
    ...
    ...
    Set GetMainTaskList = MainTasks
    End Function
    Использование:
    Код (LotusScript):
    Dim Tasks As Variant
    Set Tasks = ListGetMainTaskList()
    Если очень нужна типизация в вызывающей функции, то параметром:
    Код (Text):
    Function GetMainTaskList(MainTasks As Variant) As Boolean
    GetMainTaskList = True  'если что-то было добавлено
    End Function
    Использование:
    Код (Text):
    Dim MainTasks List As String
    If ListGetMainTaskList(MainTasks) Then
    ... 'что-то делаем
    End If
    Но самый правильный способ это тот, что предлагали Morpheus и turumbay, но его я бы использовал там, где планируется/возможно повторное использование этого класса (у меня парочку классов-списков есть, но надо точно знать, зачем оно надо, и какие плюсы это несёт, т.к. есть и минусы).
     
  6. azzzza

    azzzza Гость

    Всем спасибо за ответы с кодом и разжевыванием.
    Думаю, мне больше всего подойдет вариант предложеный Morpheus и при необходимости turumbay.
     
Загрузка...
Похожие Темы - возратить список из
  1. gx6060
    Ответов:
    2
    Просмотров:
    421
  2. gx6060
    Ответов:
    6
    Просмотров:
    561
  3. Shandrik
    Ответов:
    6
    Просмотров:
    806
  4. anna
    Ответов:
    8
    Просмотров:
    813
  5. erhe
    Ответов:
    10
    Просмотров:
    790

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