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

Тема в разделе "Lotus - Программирование", создана пользователем fedotxxl, 15 дек 2010.

  1. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Пример конструкции, которую я хочу заставить работать
    Код (LotusScript):
    Call Me.addButton(new makeAgreementButton())
    Не работает, а очень бы хотелось =(
     
  2. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    LotusScript — это Вам не Java ;)
    Можно извернуться как-то так:
    Код (LotusScript):
    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 вызван тем, что по выходу из процедуры/функции временные объекты виртуальной машиной утилизируются.
     
  3. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Не... именно хотелось уменьшить кол-во строк кода
     
  4. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    fedotxxl
    нет, так делать нельзя
    и суть не в убогости скрипта а в убогости понимания ситуации

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

    так делать принципиально нельзя ни в одном языке - если мы заговорили о правильности кода
     
  5. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Ничего подобного. Утилизируются когда больше нет ссылок на объект. Так что так вполне можно:

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

    Function getAgreementButton() As AgreementButton
    Set getAgreementButton = new makeAgreementButton()
    End Function
    Предположу, что ввела в заблуждение другая ситуация. Когда внутри метода получается объект-контейнер (например NotesDatabase), а через него содержимое (NotesDocument). Типа такого:

    Код (LotusScript):
    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-объекты, полученные через неё.

    Мда!? Ручаешься?
     
  6. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    В точку.
    IBM другого мнения. Ищем в справке дизайнера "Examples: generateXML method" и находим в тесте примера строки:
    Код (C++):
            BufferedWriter bw = new BufferedWriter(new
    FileWriter("c:\\temp\\document.xml"));
     
  7. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    через метод работать не будет. если совсем невмоготу, то можно заменить вызов Call foo(param) на Set foo = param
    Код (Text):
    property set addButton() As Button
    ' в предположении, что добавляем кнопку в List:
    Set buttons( ... ) = addButton
    ...
    end property
    ...
    ' тогда вместо Call Me.addButton(new makeAgreementButton()) юзаем:
    Set me.addButton = new makeAgreementButton()
    но, имхо, минусы такого сеттера первешивают плюс от экономии строки.
    И еще есть подводные камни: http://codeby.net/index.php?showtopic=30376
     
Загрузка...

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