Пришлось сделать другой @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.: Не знаю пока таит ли этот обходной код какие-то грабли.
- Пришлось сделать другой @def, а встроенному явно не хватает функциональности, andylars 08.12.2014 09:08 / 08.12.2014 10:55
- Ответ, Misha v.3 [M] 08.12.2014 12:24