parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Пришлось сделать другой @def, а встроенному явно не хватает функциональности

andylars 08.12.2014 09:08 / 08.12.2014 10:55

Можно ли в будущих версиях ожидать улучшения для def ?

Возвращаясь к нижним тредам о лаконичной проверки существования переменной/субобъекта/субполя обходные варианты не без изъянов.

хочется без извращений уметь:
^if(def $object.subobject){true}{false}

#а также как проверка на существование метода
#потому, что толку от <is junction> нет, 
#пока ты не знаешь есть оно вообще или нет
#не сканировать же каждый раз список методов через reflection

^if(def $obj.sub.junction){true}{false}
Workaround через свой @def + ^try{object} оказывается слабоприменим

во-первых неудобно:
в один параметр @def[object] не сделать, т.к. при попытке передать в ^def[object.subobject] ругнется как раз на это не_существующее поле,
а отделять "хвост" на ходу...а если это object.sub.sub.sub...
и "несуществование" где-то посередине это вообще становится какой-то ад.
да и вообще оно не работает с ^def[obj.sub;sub2] даже если оное существует

т.е. при варианте с
$h[^hash::create[$object]]
болячка та же, object;field можно только двумя параметрами, что гимморой
если это многосоставной объект

а во-вторых:
если это свой-во или junction, то такой def делая ^try{$object}
исполнить $junction или код в обработке свойства, что может быть совершенной не полезной лишней итерацией, которую не хочется, тем более если там какой-то "счетчик" (или в выражениях оно тоже считается за "пинок"?)

поэтому проверить "не дотрагиваясь" можно только встроенным оператором, либо делать монструзный рекурсивный обход списков полей и методов через reflection, и это на каждый def-"чих"


в итоге пока сделал вот такой def, но только при условии $STRICT-VARS(false) в конфиге
@main[]

#теперь можно чекать объект.суб.суб любой вложенности в один приём
^if(^def[$Object.Sub.Sub.Subfield]){  object is exist }

#а также для удобства не отходя от кассы можно задать и проверяемый тип(класс)
^if(^def[$Object.Sub.Sub.Subfield;string]){ object is exist and type is equal}

@def[object;type]
^if((!def $type && $object.CLASS_NAME ne 'void') || (def $type && $object.CLASS_NAME eq $type)){
   $result(true)
}{
   $result(false)
}
P.S.: Не знаю пока таит ли этот обходной код какие-то грабли.