Что нового

Дефолтные аргументы функции

winkot

Новичок
Сообщения
169
Репутация
0
Почему не срабатывает дефолтное значение аргумента $var1?
Код:
Test('', 2)
Func Test($var1=3, $var2=5)
    MsgBox('', '', $var1)
    MsgBox('', '', $var2)
EndFunc   ;==>Test
 

RaZum

Знающий
Сообщения
78
Репутация
14
потому что параметр присутствует
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
Test(Default, 2)
Func Test($var1=Default, $var2=Default)
    If $var1 = Default Then $var1 = 3
    If $var2 = Default Then $var2 = 5
    MsgBox('', '', $var1)
    MsgBox('', '', $var2)
EndFunc   ;==>Test
 
Автор
W

winkot

Новичок
Сообщения
169
Репутация
0
потому что параметр присутствует
Ну как же он присутствует? Первый параметр ''. Обычно для аргумента функции это означает отсутствующее значение.
Сообщение автоматически объединено:

Код:
Test(Default, 2)
Func Test($var1=Default, $var2=Default)
    If $var1 = Default Then $var1 = 3
    If $var2 = Default Then $var2 = 5
    MsgBox('', '', $var1)
    MsgBox('', '', $var2)
EndFunc   ;==>Test
Да, конечно так можно. Но раньше у меня работал и мой вариант. Он выглядит проще и более компактный. Хотелось бы разобраться почему он сейчас не работает.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
для аргумента функции это означает отсутствующее значение
Не отсутствующее, а пустое. Так проще реализовывать функции
Код:
Func S($s = "")
  If $s Then ConsoleWrite($s & @CRLF)
EndFunc

Func I($i = 0)
  If $i Then ConsoleWrite($i & @CRLF)
EndFunc
 

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
Да, конечно так можно. Но раньше у меня работал и мой вариант
А обновлялась ли версия Autoit - и какая у вас сейчас? На мой взгляд, в Autoit происходят изменения, которые в справке не всегда описываются... Кто-то мог послать авторам пример подобный вашему, посчитать это багом и это было исправлено., т.к. действительно данные передаются в виде пустой строки...
Что касается последней версии 3.3.16.1, то ИМХО она стала более ТипоЗависимой - у себя пришлось в 20-30 функциях вставлять Number() для ряда переменных, хотя раньше работало и без этого...
 

RaZum

Знающий
Сообщения
78
Репутация
14
При вызове функции, на первом этапе проверяется присутствие переданного параметра (не значения параметра!), и если параметр присутствует, то дефолтное значение игнорируется, вне зависимости от значения переданного параметра (0, "", NUL, False ...). Ключевые значения (обычно их указывают по умолчанию) проверяются последующими условиями функции.

Для проверки количества переданных в функцию параметров, можно использовать макрос @NumParams

Пропускать параметры нельзя, но можно не указывать остальные (либо все, если все они необязательные). Если нужно указать следующий параметр, то текущий тоже должен быть указан.
Если в вызове функции предусмотрены как обязательные, так и необязательные параметры, то обязательные параметры (без значений по умолчанию) в вызове функции распологаются в начале (слева), а необязательные (со значениями по умолчанию) далее (справа).

Версия 3.3.16.1

Поправте, если что не так
 

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
К сожалению нет - я не виду учёт изменениям своих функций. В TCIMG своя UDF из 4000 функций, обычно при обновлении Autoit я прошу пользователей проверить свои команды и они отписываются что не так... Я исправляю или нахожу баги в функциях Autoit, которые передаю на оф. сайт или здесь спрашиваю - в течении месяца все ошибки находятся, последнюю я обновлял 17.10.2022, так что уже не помню, где исправлял.., но это не касалось родных функций Autoit
 
Автор
W

winkot

Новичок
Сообщения
169
Репутация
0
А обновлялась ли версия Autoit - и какая у вас сейчас?
3.3.16.1
Сообщение автоматически объединено:

Пропускать параметры нельзя, но можно не указывать остальные
Каким образом не указывать? Просто пропускать? , , Или так: ,"", ?
 

RaZum

Знающий
Сообщения
78
Репутация
14
По поводу Number ()
Адаптация переменных Autoit порой выходит боком.
Например чтение ini - файла передаёт в переменные строковые значения, и если это были числа, то при сложении например "0" + 5 = 5, "0" = 0, а при проверке переменной со значением "0" в условиях, получается True
 
Автор
W

winkot

Новичок
Сообщения
169
Репутация
0
Вот пример из справки
Код:
Функция WinClose
WinClose("Untitled - Notepad", "")

Второй параметр здесь не нужен. Зачем же тогда поставили "" ?
Получается, что будет закрыто окно с пустым текстом. А имелось ввиду - с любым текстом. И на самом деле так и есть.
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
проверяется присутствие переданного параметра (не значения параметра!)
В функцию передаются именно значения. И по наличию значений определяется количество параметров.
вне зависимости от значения переданного параметра
Как раз в зависимости от значения. Это значение будет присвоено параметру независимо от значения по умолчанию.
Просто пропускать? , , Или так: ,"", ?
Пропускать нельзя. Но можно указать такое же, как по умолчанию. Или Default, если функция его обрабатывает.
при проверке переменной со значением "0" в условиях, получается True
Всё верно. Не пустая строка - это истина.
Зачем же тогда поставили "" ?
Потому что это не запрещено. Хотите - ставите, хотите - нет.
 

RaZum

Знающий
Сообщения
78
Репутация
14
Код:
FileOpenDialog ("title", "ini dir", "filter" [, options = 0 [, "default name" [, hwnd ]]] )

В квадратных скобках параметры, которые можно неуказывать, но если, например, нужно указать "default name", то "options" то же нужно указать, а "hwnd" ненужно.
Вложенность квадратных скобок указывает на иерархию обязательного присутствия всех предыдущих параметров для указания последующего.
Пропускать , , , , так нельзя, это отсутствие параметра и ошибка синтаксиса, но можно указавыть пустые значения параметров (если они не важны) например так 0, "", NUL
В некоторых случаях можно указывать Default, либо просто указывать значения по умолчанию.
 
Автор
W

winkot

Новичок
Сообщения
169
Репутация
0
Потому что это не запрещено. Хотите - ставите, хотите - нет.
Теперь вообще ничего не понятно. Выше же отмечали, что в случае "" дефолтное значение не будет использовано потому, что присутствует параметр. А теперь получается, что есть "", что нет - никакой разницы? В моем первом сообщении в коде показано, что между кавычками есть пробел ' '. На самом деле это не так. Я поставил '' (одинарные кавычки) но при загрузке на сайт это было показано по другому.
Сообщение автоматически объединено:

Код:
Func I($i = 0)
  If $i Then ConsoleWrite($i & @CRLF)
EndFunc
Немного переделал вашу функцию.
Код:
I(5, "", 9)
Func I($q, $i = 1, $t = 7)
    ConsoleWrite($q & @CRLF & $i & @CRLF & $t & @CRLF)
EndFunc


Не работает. В ответ получаю
Код:
>"C:\Program Files (x86)\AutoIt3\SciTE\..\AutoIt3.exe" "C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.au3" /run /prod /ErrorStdOut /in "D:\Yandex\AutoIt\MyMsg\Test5.1.au3" /UserParams    
5

9
>Exit code: 0    Time: 0.8279

Что не так то?
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
получается, что есть "", что нет - никакой разницы?
В английской справке для функции WinClose написано
text[optional] The text of the window to close. Default is an empty string.
По умолчанию пустая строка. Поэтому никакой разницы, что вы явно передадите пустую строку, что не укажете значение.

Всё правильно работает. Вы передали три значения: цифру пять, пустую строку, цифру девять. Значения параметров по умолчанию были заменены на переданные, что и выведено в консоль.
 
Автор темы Похожие темы Форум Ответы Дата
N Общие вопросы по AutoIt 0
Верх