Страница 1 из 1
Изящный способ вернуть динамическую строку
Добавлено: 14 Февраль 2016, 2:28
Дед Пахом
Автор Mike Hanson.
Код: Выделить всё
PROGRAM
MAP
end
c1 CLASS
GiveMeAString Procedure(),String
end
CODE
Message(c1.GiveMeAString())
c1.GiveMeAString PROCEDURE
LocalClass CLASS
MyString &String
Destruct PROCEDURE
END
CODE
LocalClass.MyString &= NEW String(100)
LocalClass.MyString = 'Here it is!'
Return LocalClass.MyString
LocalClass.Destruct PROCEDURE
Code
Message('Destructor is killing the string now')
Dispose(SELF.MyString)
Изящный способ вернуть динамическую строку
Добавлено: 14 Февраль 2016, 8:08
Игорь Столяров
Прикольно.

Но не очевидно, например с повторным вызовом.

Мне как-то ближе традиционный вариант того же самого, от греха подальше ...

По крайне мере я контролирую зону действия переменной, могу ее использовать в этой зоне
и не нарвусь на GPF при обращении по несуществующему адресу.
Код: Выделить всё
Map
GetVarString(long),*string
end
MyString &String
Code
MyString &= GetVarString(123)
If ~(MyString &= NULL)
Message(MyString)
Dispose(MyString)
end
GetVarString Procedure(xSize_)
RetString &String
Code
RetString &= New(String(xSize_))
If ~(RetString &= NULL) then RetString = 'Привет лунатикам !'.
Return RetString
Изящный способ вернуть динамическую строку
Добавлено: 14 Февраль 2016, 9:51
PavelNK
Тогда уж так
Код: Выделить всё
Map
GetVarString(long),*string
end
MyString &String
Code
If ~(MyString &= NULL)
Dispose(MyString)
MyString &= NULL
end
MyString &= GetVarString(123)
If ~(MyString &= NULL)
Message(MyString)
Dispose(MyString)
MyString &= NULL
end
GetVarString Procedure(xSize_)
RetString &String
Code
RetString &= New(String(xSize_))
If ~(RetString &= NULL) then RetString = 'Привет лунатикам !'.
Return RetString
Изящный способ вернуть динамическую строку
Добавлено: 14 Февраль 2016, 10:23
Игорь Столяров
Ну это уже из серии "презерватив на свечку".

У меня ведь в примере нет использования ЛОКАЛЬНО объявленной переменной MyString, зачем ее сбрасывать ?
А связка
оставляет ощущение, что, что одно здесь точно лишнее ...

Изящный способ вернуть динамическую строку
Добавлено: 14 Февраль 2016, 17:06
Yufil
Насколько я понял, здесь речь о тонкой разнице между
procedure (),*String
......
Return s
и
procedure(),String
......
Return (s)
Если пишется в скобках, выражение разыменовывается, а если без скобок-возвращается адрес.
Если s является ссылкой на строку, эту ссылку можно вернуть в качестве результата.
Изящный способ вернуть динамическую строку
Добавлено: 14 Февраль 2016, 17:35
Дед Пахом
тут проблема в чём: если s ссылка на строку, то
Код: Выделить всё
s &= NEW STRING(100)
s = 'Here it is'
RETURN (s)
не освобождает выделенную память.
Изящный способ вернуть динамическую строку
Добавлено: 14 Февраль 2016, 17:47
PavelNK
Опыт, сын ошибок трудных, говорит: Надень два, даже если это свечка! Это не трудно и не накладно, зато надежно
Игорь Столяров писал(а): Ну это уже из серии "презерватив на свечку".

У меня ведь в примере нет использования ЛОКАЛЬНО объявленной переменной MyString, зачем ее сбрасывать ?
А связка
оставляет ощущение, что, что одно здесь точно лишнее ...

Изящный способ вернуть динамическую строку
Добавлено: 14 Февраль 2016, 22:35
Yufil
Дед Пахом писал(а):
s &= NEW STRING(100)
s = 'Here it is'
RETURN (s)
не освобождает выделенную память.
С уважением, ДП
Это просто не сработает, Return(s) вернёт не ссылку на строку, а её значение.
А декларация прописана как
Map
GetVarString(long),*string
end
Но фишку я так и не просёк...
Изящный способ вернуть динамическую строку
Добавлено: 14 Февраль 2016, 22:39
Дед Пахом
Именно о декларации "(), STRING" речь изначально. Фишка в том, что, объявив в процедуре локальный класс с деструктором, можно возвращать по RETURN то, что было создано NEW.
Изящный способ вернуть динамическую строку
Добавлено: 14 Февраль 2016, 22:48
Игорь Столяров
Я бы сказал проще: используется неявный вызов Dispose(SELF.MyString) через LocalClass.Destruct. В этом основная фишка.
Пример действительно интересно показывает, как можно выполнить некий код после оператора RETURN в процедуре,
чего сделать традиционным способом наверное невозможно ....
