24.09.2013, 18:37 | #1 |
Участник
|
Проверить переменную на null
Здравствуйте!
Есть класс, в котором есть метод, который может принимать на вход переменную anytype, а может и не принимать (значение по умолчанию null). X++: void myMethod(anytype _var = null) { .... } вариант: X++: if (_var == null) Из того, что смог сделать, спасло только: X++: if (strfmt("%1", typeof(_var)) == "") PS: Извиняйте, если уже обсуждалось. Я искал, но не нашел. |
|
24.09.2013, 18:56 | #2 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: mazzy (2), PMS (1). |
24.09.2013, 19:31 | #3 |
Участник
|
prmIsDefault не помог в данной ситуации, всегда возвращает 0 (вне зависимости от того, передали что-нибудь или нет).
А вот с X++: if (_var) Спасибо большое! Почему-то изначально отверг этот вариант (пробовал, но не заработал, видимо в силу каких-то других причин). Вечер, все-таки... |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
24.09.2013, 20:02 | #4 |
Участник
|
Как мне кажется, единственное решение именно через typeOf(). Возможно, в комбинации с prmIsDefault(). Причем, значение typeOf(null) = 44, несмотря на то, что Types имеет значения от 0 до 17.
X++: static client void Job_test(Args _args) { void test(anytype _var = null) { if (prmIsDefault(_var)) info('default parameters'); else info('not default parameters'); if (_var) info('exist value'); else info('not exists value'); if (typeOf(_var)) info(strFmt('exist type \"%1\" typesNum = %2', typeOf(_var), int2str(typeOf(_var)))); else info('not exists type'); } ; warning('without parameters'); test(); info(''); warning('set null'); test(null); info(''); warning('set empty string'); test(''); info(''); warning('set value'); test(1); info(''); return; }
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: PMS (1). |
24.09.2013, 23:48 | #5 |
Участник
|
Цитата:
|
|
|
За это сообщение автора поблагодарили: belugin (5), PMS (1). |
25.09.2013, 09:56 | #6 |
Участник
|
Владимир, спасибо большое за подробнейший ответ!
Это мне напомнило, почему вчера не заработал вариант: X++: if (_var) Видимо, все-таки, правильная проверка: X++: if (typeOf(_var) == 44) Цитата:
X++: void myMethod(anytype _var1 = null, anytype _var2 = null, anytype _var3 = null, anytype _var4 = null ..) { |
|
25.09.2013, 10:32 | #7 |
Участник
|
Цитата:
X++: static void job_test_prmIsDefault_anytype(Args _args) { void myMethod(anytype _var = null) { ; info(int2str(prmIsDefault(_var))); } ; myMethod(); myMethod(NULL); myMethod(1); } Последний раз редактировалось S.Kuskov; 25.09.2013 в 10:45. |
|
25.09.2013, 10:51 | #8 |
Участник
|
Да, это у меня на AX4.0 тоже работает. Но попробуйте передать через цепочку вызовов и это перестает работать:
X++: static void job_test_prmIsDefault_anytype(Args _args) { void myMethod2(anytype _var = null) { ; info(int2str(prmIsDefault(_var))); } void myMethod(anytype _var = null) { ; myMethod2(_var); } ; myMethod(); myMethod(NULL); myMethod(1); } |
|
25.09.2013, 10:55 | #9 |
Участник
|
Потому, что в первый метод вы всегда передаете значение
X++: static void job_test_prmIsDefault_anytype(Args _args) { void myMethod2(anytype _var = null) { ; info(int2str(prmIsDefault(_var))); } void myMethod(anytype _var = null) { ; if (prmisDefault(_var)) { myMethod2(); } else { myMethod2(_var); } } ; myMethod(); myMethod(NULL); myMethod(1); } |
|
25.09.2013, 10:57 | #10 |
Участник
|
|
|
25.09.2013, 11:02 | #11 |
Участник
|
Ещё стоит отметить, что prmisDefault это единственный способ отличить пропуск параметра от передачи параметра совпадающего со значением по умолчанию.
|
|
25.09.2013, 11:05 | #12 |
Участник
|
|
|
25.09.2013, 11:07 | #13 |
Участник
|
Да, для одного вызова именно так. Но, к сожалению, при цепочке вызовов эта информация теряется, и остается расчитывать на null.
|
|
25.09.2013, 11:09 | #14 |
Участник
|
|
|
25.09.2013, 11:55 | #15 |
Участник
|
|
|
25.09.2013, 12:18 | #16 |
Участник
|
Если отойти от джобов и использовать классы, то видно, что один и тот же параметр передаётся через несколько методов. Обычно из этого следует, что нужно изменить его на поле класса и инициализировать его через конструктор или set-метод. Задача сведётся к проверке anytype-переменной на значение null. Если это не ваш случай, тогда слушайте, что говорит вам belugin.
__________________
// no comments |
|
26.09.2013, 14:18 | #17 |
Участник
|
Цитата:
Сообщение от PMS
Ну, тут нужно, так как дело в том, что нужно написать метод, в который может передаваться несколько параметров, а может и не передаваться (заранее это не известно):
X++: void myMethod(anytype _var1 = null, anytype _var2 = null, anytype _var3 = null, anytype _var4 = null ..) { Задача передачи не определенного количества параметров решается через передачу одного параметра-контейнера (Container). Сколько элементов в контейнере, столько и параметров. Разные элементы одного и того же контейнера могут иметь разные типы Можно вместо контейнера использовать объект STRUCT, если требуется знать имя параметра. Объект Struct также позволяет записывать разные типы данных в разные элементы структуры. По сути, Struct - это программная симуляция одной записи временной таблицы. Ну, или использовать 2 контейнера: Один с именами, другой со значениями. Хотя и это все не есть "правильные" решения. Если Вы пытаетесь сделать "обвязку" методов COM-объекта, то и надо делать отдельный метод класса Axapta под каждый конкретный метод конкретного Com-объекта. Посмотрите, для примера, классы CCADO... или семейство классов SysExcel...
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|