• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

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

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

azzzza

Собственно, сабж. Язык - 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
 
H

hosm

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

morpheus

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 ... ' ничего нету

набросал тут, могут быть помарки
 
T

turumbay

В функции формирую определенный список и не знаю, каким образом можно его вернуть.
Я так понимаю, что функция возвращает мне тип 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 786
157
BIT
81
Если всё-таки 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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!