15.05.2012, 10:26 | #1 |
MCP
|
Job - Интересное наблюдение
Добрый день!
Случайно заметил странное поведение. Создаем такой джоб: X++: static void testFunction(Args _args) { boolean check() { boolean ret = true; ; } ; if(check()) info(strfmt("true")); else info(strfmt("false")); } Если бы это был класс, и check() был бы отдельным булевским методом, не возвращающим значение - система всегда вылетала бы в отладчик с сообщением: "Функция никогда не возвращает значение" Понятно что это не по BestPractice, но я всегда думал что функции внутри методов обрабатываются также, как отдельные методы. Выходит что нет. Проверял на DAX 4.0 |
|
|
За это сообщение автора поблагодарили: lev (2), S.Kuskov (3), JeS (1), Dark Light (1). |
15.05.2012, 10:38 | #2 |
Участник
|
в AX2009 тоже самое
|
|
15.05.2012, 10:41 | #3 |
Участник
|
Занятно. В 5ке также. А если сделать так
X++: static void testFunction(Args _args) { str check() { } ; info(check()); } |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2), kornix (1). |
15.05.2012, 10:45 | #4 |
MCT
|
4.0.2501.116
Все компилится и запускается. а если подредактировать так X++: static void testFunction(Args _args) { boolean check() { boolean ret = true; return ret; } ; if(check()) info(strfmt("true")); else info(strfmt("false")); }
__________________
Axapta book for developer Последний раз редактировалось MikeR; 15.05.2012 в 10:49. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (0). |
15.05.2012, 10:51 | #5 |
MCP
|
Еще интересней:
X++: static void testFunction(Args _args) { boolean check() { ; return 3; } ; info(strfmt("%1", check())); } Каким образом логическая функция может вернуть что-то отличное от 0 или 1? Последний раз редактировалось kornix; 15.05.2012 в 10:57. |
|
15.05.2012, 10:56 | #6 |
Участник
|
в аксапте булевый тип - это enum, а enum в аксапте - это int. Воот
X++: print typeof(true); print typeof(boolean::true); pause; |
|
|
За это сообщение автора поблагодарили: kornix (3). |
15.05.2012, 11:04 | #7 |
MCT
|
я бы даже так сказал. При преобразовании int в boolean. Все что не 0 true, 0 это false.
Это во многих языках так. PS Извиняюсь, что вмешался в процесс взаимоодобрения и воодушевления
__________________
Axapta book for developer |
|
15.05.2012, 11:06 | #8 |
Ищущий знания...
|
Так про то и речь, что возврата в функции нет, а джоб все равно запускается и даже что то там работает, хоть и компилится с ошибкой
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
15.05.2012, 11:09 | #9 |
MCT
|
Ну так return же нет, поэтому не знает что возвращать, поэтому возвращает false. Повторюсь у меня компилится нормально.
__________________
Axapta book for developer |
|
15.05.2012, 11:10 | #10 |
MCP
|
Цитата:
в аксапте булевый тип - это enum, а enum в аксапте - это int
Но почему-то код ниже возвращает 182 X++: static void testFunction(Args _args) { boolean check() { ; return 54654654646; } ; info(strfmt("%1", check())); } |
|
15.05.2012, 11:11 | #11 |
Участник
|
|
|
15.05.2012, 11:12 | #12 |
Участник
|
X++: info(int2str(54654654646 mod 256)); X++: info(int2str(54654654646 & 255)); Последний раз редактировалось S.Kuskov; 15.05.2012 в 11:22. |
|
15.05.2012, 11:16 | #13 |
Участник
|
Интересно что явное присваивание переменной типизирует значение корректно, в отличии от просто возврата из функции (причём не только из локальной).
X++: boolean b; boolean check() { return 3; } ; b = check(); info(strfmt("%1", check())); info(strfmt("%1", b)); |
|
15.05.2012, 11:23 | #14 |
Участник
|
А в 3-ке еще можно было при вызове локального метода обязательные значения параметров не указывать и прокатывало
|
|
|
|