• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

Возможна ли инициализация объекта класса в момент передачи параметра в

  • Автор темы Автор темы fedotxxl
  • Дата начала Дата начала
F

fedotxxl

Пример конструкции, которую я хочу заставить работать
Код:
Call Me.addButton(new makeAgreementButton())
Не работает, а очень бы хотелось =(
 
LotusScript — это Вам не Java ;)
Можно извернуться как-то так:
Код:
Dim holder As Variant
Call Me.addButton(getAgreementButton(holder)) ', где getAgreementButton — функция с кодом типа

Function getAgreementButton(holder As Variant) As Variant
Set holder = new makeAgreementButton()
Set getAgreementButton = holder
End Function
Изврат с holder вызван тем, что по выходу из процедуры/функции временные объекты виртуальной машиной утилизируются.
 
Не... именно хотелось уменьшить кол-во строк кода
 
fedotxxl
нет, так делать нельзя
и суть не в убогости скрипта а в убогости понимания ситуации

вы передаёте только что созданный обьект, который негде не использован и нигде не присвоен
если в основном коде он реально вам НЕ НУЖЕН то передавайте Nothing а уже внутри функции создавайте его и живите им

так делать принципиально нельзя ни в одном языке - если мы заговорили о правильности кода
 
Изврат с holder вызван тем, что по выходу из процедуры/функции временные объекты виртуальной машиной утилизируются.

Ничего подобного. Утилизируются когда больше нет ссылок на объект. Так что так вполне можно:

Код:
Call Me.addButton(getAgreementButton()) ', где getAgreementButton — функция с кодом типа

Function getAgreementButton() As AgreementButton
Set getAgreementButton = new makeAgreementButton()
End Function

Предположу, что ввела в заблуждение другая ситуация. Когда внутри метода получается объект-контейнер (например NotesDatabase), а через него содержимое (NotesDocument). Типа такого:

Код:
sub foo()
if getDoc() is nothing then MsgBox "Всегда True"
end sub

function getDoc as NotesDocument
Dim db as NotesDatabase
...
Set db=ns.GetDatabase(...)
Set getDoc = db.getDocumentByUnid(...)
end function

При выходе из метода не остаётся ссылок на базу и её хэндл закрывается. Как следствие, уничтожаются LS-объекты, полученные через неё.

так делать принципиально нельзя ни в одном языке
Мда!? Ручаешься?
 
Предположу, что ввела в заблуждение другая ситуация. Когда внутри метода получается объект-контейнер (например NotesDatabase), а через него содержимое (NotesDocument)
В точку.
так делать принципиально нельзя ни в одном языке - если мы заговорили о правильности кода
IBM другого мнения. Ищем в справке дизайнера "Examples: generateXML method" и находим в тесте примера строки:
C++:
		BufferedWriter bw = new BufferedWriter(new
FileWriter("c:\\temp\\document.xml"));
 
Пример конструкции, которую я хочу заставить работать
Код:
Call Me.addButton(new makeAgreementButton())
через метод работать не будет. если совсем невмоготу, то можно заменить вызов Call foo(param) на Set foo = param
Код:
property set addButton() As Button
' в предположении, что добавляем кнопку в List:
Set buttons( ... ) = addButton
...
end property
...
' тогда вместо Call Me.addButton(new makeAgreementButton()) юзаем:
Set me.addButton = new makeAgreementButton()
но, имхо, минусы такого сеттера первешивают плюс от экономии строки.
И еще есть подводные камни: link removed
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab