AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.03.2011, 13:34   #1  
Varmen is offline
Varmen
Участник
 
190 / 13 (1) ++
Регистрация: 02.10.2007
базовый вопрос X++, частичная передача параметров по умолчанию
Добрый день всем, есть если возможность при вызове функции (метода) имеющего необязательные параметры, поименно обратится к только одному параметру во время вызова функции (метода):

Типа такого, пусть есть функция, с таким определением:

str function myTest( int _i="99", str _s ="fox")

Пусть я вызываю ее тут
X++:
main() {
 
 //делаю типа такого, первый параметр не интересует, второй же хочу передать, но ошибка компиляции во всех случаях
 
 myTest ( ,_s="two fox");
 myTest ( ,"two fox");
 myTest ( ,_s:="two fox");
}
Я конечно обхожу, узнавая дефолтные значения и передавая их, но это некрасиво. Типа того

myTest (99 ,"two fox");
__________________
The Variable men power.
Старый 14.03.2011, 13:52   #2  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Можно вот как:
1. Пусть есть метод:
X++:
void myMethod(Int _i, str _s)
{
    ;
    // тело метода
}
Тогда если вы хотите передать только второй параметр, нужно обязательно указать и первый:
X++:
this.myMethod(1, "fox");
2. Если ваш метод на входе имеет необязательные параметры, то можно делать так:
X++:
void myMethod(Int _i=0, str _s="")
{
    ;
    // тело метода
}
Тогда передавать только второй параметр можно так:
X++:
this.myMethod(0, "fox");
Плюс, есть системная функция, позволяющая узнать: является ли входящее в метод значение дефолтным:
X++:
prmIsDefault()

Последний раз редактировалось kornix; 14.03.2011 в 14:00.
За это сообщение автора поблагодарили: AlGol (2), Poleax (1).
Старый 14.03.2011, 14:50   #3  
AlGol is offline
AlGol
Участник
 
277 / 93 (4) ++++
Регистрация: 24.12.2001
Адрес: Тверь.
Цитата:
Сообщение от kornix Посмотреть сообщение
Плюс, есть системная функция, позволяющая узнать: является ли входящее в метод значение дефолтным:
X++:
prmIsDefault()
Вот тут есть ньюансы:
функция prmIsDefault() опеределяет не то, что входящее значение является дефолтным, а был ли параметр функции присвоен по дефолту или получен извне.

Т.е. если есть функция

X++:
void fn(boolean b = true, int j = 42)
{
    ;
    print prmIsDefault(b);
    pause;
}
То при вызове fn(), мы получим 1.
А при вызове fn(true), мы получим 0.
За это сообщение автора поблагодарили: kornix (1).
Старый 14.03.2011, 14:52   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Varmen Посмотреть сообщение
Добрый день всем, есть если возможность при вызове функции (метода) имеющего необязательные параметры, поименно обратится к только одному параметру во время вызова функции (метода)
Нет, такой возможности нет.
См.также Greg On Dynamics Ax: Refactoring a long parameter list of boolean flags

По поводу prmIsDefault. Эта функция позволяет определить был ли параметр при вызове функции указан явно (не важно совподающий по значению с параметром по умолчанию или нет) или же была использована сокращённая форма вызова. Т.е. с помощью неё можно отличить например такие два случая:
X++:
void myMethod(Int _i, str _s="")
{
    ;
    // тело метода
}
X++:
this.myMethod(0, "");
this.myMethod(0);
Обычно метафункцию prmIsDefault используют в целях оптимизации, для того чтобы повторно не вычислять выражение являющееся значением по умолчанию. Ведь в отличии от C++ в аксапте такое выражение может быть достаточно сложным, включать в себя вызовы методов и содержать ссылки на контекст и даже на соседние параметры.
Старый 14.03.2011, 14:55   #5  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Цитата:
Сообщение от Varmen Посмотреть сообщение
str function myTest( int _i="99", str _s ="fox")
присваивать интовой переменной по умолчанию строку - это сильно

а вообще - я в таких (прямо скажем, не очень частых) случаях передаю параметром контейнер. а уже внутри функции разбираю его на составляющие.
__________________
С уважением,
Вячеслав
За это сообщение автора поблагодарили: Pustik (2), DSPIC (-2).
Старый 14.03.2011, 19:24   #6  
Varmen is offline
Varmen
Участник
 
190 / 13 (1) ++
Регистрация: 02.10.2007
Большое спасибо всем!
__________________
The Variable men power.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Передача переменного числа параметров в метод lemchey_white DAX: Программирование 16 14.12.2009 21:21
Передача параметров запроса из CurrentList tolstjak DAX: Программирование 3 21.04.2008 09:56
Передача параметров AlexP DAX: Программирование 7 22.12.2004 16:29
Передача параметров Vpooh DAX: Программирование 2 21.10.2003 13:43
передача параметров в Report eugene egorov DAX: Программирование 1 25.06.2002 19:34
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:37.