Что нового

Использование символа "&" в параметрах функции

---Zak---

Скриптер
Сообщения
455
Репутация
120
Добрый день.

Поиск что-то ничего не дает...

Столкнулся с такой проблемой, как использование в параметрах функции символа "&".
Привожу маленький банальный пример - думаю он все покажет и расскажет...

Код:
ConsoleWrite(_InetGetURL2()&@CRLF)

Func _InetGetURL2($InetGetDir = @ScriptDir&'\mp3')
	Return $InetGetDir
EndFunc


Код:
(3,43) : ERROR: syntax error
Func _InetGetURL2($InetGetDir = @ScriptDir&
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

Куда надо кавычку поставить ??? Или придется все же еще писать три строки ???

Код:
ConsoleWrite(_InetGetURL2()&@CRLF)

Func _InetGetURL2($InetGetDir = '')
	If $InetGetDir == '' Then
		$InetGetDir = @ScriptDir&'\mp3'
	EndIf
	Return $InetGetDir
EndFunc


ЗЫ: что-то посидел и подумал - проблема как бы не в самой макроссылке, а в использовании символа "&" - тему переименовал.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
думаю что только так
хотя, может и нет :smile:
Код:
Const $var = @ScriptDir&'\mp3' ; или Global $var = @ScriptDir&'\mp3'

ConsoleWrite(_InetGetURL2()&@CRLF)

Func _InetGetURL2($InetGetDir = $var)
    Return $InetGetDir
EndFunc
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
joiner
Подожем может еще кто-то что-то придумает)))) Но одна строка это уже прогресс.

Спасибо
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Код:
ConsoleWrite(_InetGetURL2() & @CRLF)

Func _InetGetURL2($InetGetDir = 0)
	If Not $InetGetDir Then Return @ScriptDir & '\mp3'
	Return $InetGetDir
EndFunc   ;==>_InetGetURL2
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
---Zak---,
Код:
ConsoleWrite(_InetGetURL2() & @CRLF)
ConsoleWrite(_InetGetURL2(@ScriptDir) & @CRLF)

Func _InetGetURL2($InetGetDir = 'чему-нибудь или пусто')
	If Not @NumParams Then Return @ScriptDir & '\mp3'
	Return $InetGetDir
EndFunc   ;==>_InetGetURL2
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
AZJIO
Код:
ConsoleWrite('Return $InetGetDir = '&_InetGetURL2(0) & @CRLF)

Func _InetGetURL2($InetGetDir = 0)
	ConsoleWrite('$InetGetDir = '&$InetGetDir&@CRLF)
    If Not $InetGetDir Then Return @ScriptDir & '\mp3'
    Return $InetGetDir
EndFunc   ;==>_InetGetURL2


Код:
$InetGetDir = 0
Return $InetGetDir = C:\AutoIT\XML\mp3
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
---Zak---
Ссылка может быть 0? Можно конечно было IsInt впихнуть, но это излишне, потому что ссылка может быть только текстом, а не числом.
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
2 madmasles
Встречный вопрос на Вашем примере - как обработать вот такое:
Код:
ConsoleWrite(_InetGetURL2("1") & @CRLF)
ConsoleWrite(_InetGetURL2("1", @ScriptDir) & @CRLF)
ConsoleWrite(_InetGetURL2("1", @ScriptDir & '\test_mp3') & @CRLF)

Func _InetGetURL2($ASD, $InetGetDir = "@ScriptDir & '\mp3'")
    If Not @NumParams Then Return Execute($InetGetDir)
    Return $InetGetDir
EndFunc   ;==>_InetGetURL2


Код:
@ScriptDir & '\mp3'
C:\AutoIT\XML
C:\AutoIT\XML\test_mp3

2 AZJIO
Ну мы предположим, что может быть или допустим это будет не ссылка, а какие-нибудь параметры . Эммм - допустим в будущем ее использовать как обработка ошибок и т.п.
ЗЫ: предлагаю найти отличное решение под все задачи))))
ЗЫЫ: я не придираюсь... решение достойное, да и к каждой задачи оно свое

Код:
ConsoleWrite('Return $InetGetDir = '&_InetGetURL2(True) & @CRLF)
ConsoleWrite('Return $InetGetDir = '&_InetGetURL2(False) & @CRLF)

Func _InetGetURL2($InetGetDir = 0)
    ConsoleWrite('$InetGetDir = '&$InetGetDir&@CRLF)
    If Not $InetGetDir Then Return @ScriptDir & '\mp3'
    Return $InetGetDir
EndFunc   ;==>_InetGetURL2


Код:
$InetGetDir = True
Return $InetGetDir = True
$InetGetDir = False
Return $InetGetDir = C:\AutoIT\XML\mp3
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
---Zak--- [?]
Встречный вопрос на Вашем примере - как обработать вот такое:
Код:
ConsoleWrite(_InetGetURL2("1") & @CRLF)
ConsoleWrite(_InetGetURL2("1", @ScriptDir) & @CRLF)
ConsoleWrite(_InetGetURL2("1", @ScriptDir & '\test_mp3') & @CRLF)

Func _InetGetURL2($ASD, $InetGetDir = "@ScriptDir & '\mp3'")
	ConsoleWrite(@NumParams & @LF)
    If @NumParams < 2 Then Return Execute($InetGetDir)
    Return $InetGetDir
EndFunc   ;==>_InetGetURL2
 

xaker

Знающий
Сообщения
52
Репутация
16
может так подойдет ?
Код:
ConsoleWrite(_InetGetURL2() & @CRLF)
ConsoleWrite(_InetGetURL2(@ScriptDir , '\test_mp3') & @CRLF)

Func _InetGetURL2($InetGetDir = @ScriptDir, $InetGetFolder = '\mp3')
	Return $InetGetDir & $InetGetFolder
EndFunc   ;==>_InetGetURL2
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
прикол в том, что тема называется - использование & в параметрах функции. почему нельзя?
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
xaker
Тут самый сок - в том, чтобы использовать 1 параметр)))))

madmasles
Намек понял - спасибо...

joiner
Выдели пожирнее - побольше размером и т.п. :IL_AutoIt_1:
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
---Zak---
Комбайн под все задачи обычно медленно работает, сложен к пониманию, содержит тучу проверок. Куда лучше определится с входными данными, а те что не подпадают под входные использовать как результат ошибки.
Execute провоцирует ошибки обфускации.

Кстати, чем тебе вариант madmasles не понравился? С небольшой модификацией.
Код:
ConsoleWrite(_InetGetURL2() & @CRLF)

Func _InetGetURL2($InetGetDir = "")
    If @NumParams < 1 Then Return @ScriptDir & '\mp3'
    Return $InetGetDir
EndFunc
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
прикол в том, что тема называется - использование & в параметрах функции. почему нельзя?

По определению нелзя! http://autoit-script.ru/autoit3_docs/keywords/Func.htm
Читаем внимательно
Код:
Опциональные параметры объявляются присваиванием им значения. Значение может быть глобальной переменной, макросом или явно заданной константой.

Для особо недоверчивых простой пример
Код:
$tmp = _myfunc()

msgbox(0, "",$tmp)

Func _myfunc($y = 1+1)
	Return $y
EndFunc
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
AZJIO
Я нигде не писал - что мне madmasles вариант не понравился и даже не писал, что мне твой вариант не понравился.

Вариант хороший, тем более, что я узнал что же такое:
Код:
@NumParams

Там есть плюс, но так же есть и минус: надо указывать "< 2"/"< 3"/"< 4"/"< 5" и т.д.
Код:
If @NumParams < 2 Then Return Execute($InetGetDir)


Проще тогда использовать:
Код:
Func _InetGetURL2($ASD, $InetGetDir = '')
    If $InetGetDir == '' Then $InetGetDir = @ScriptDir&'\mp3'
    Return $InetGetDir
EndFunc


Или вариантом joiner - ответ #1
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Re: Использование символа \"&\" в параметрах функции

Кстати вспомнил, что для этой цели используется ключевое слово Default


Добавлено:
Сообщение автоматически объединено:

Код:
ConsoleWrite(_InetGetURL2() & @CRLF)

Func _InetGetURL2($InetGetDir = Default)
	If $InetGetDir = Default Then $InetGetDir = @ScriptDir & '\mp3'
	Switch @NumParams ; ещё одна конструкция
		Case 0
			MsgBox(0, 'Сообщение', $InetGetDir)
		Case 1
			MsgBox(0, 'Сообщение', $InetGetDir)
		Case Else
			MsgBox(0, 'Сообщение', $InetGetDir)
	EndSwitch
    Return $InetGetDir
EndFunc
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
AZJIO
Вооо... отлично !!! Даже два в одном... спасибки... пойду склею что-нибудь подобное.

Хотя если написать:
Код:
If $InetGetDir = Default Then $InetGetDir = @ScriptDir & '\mp3'

Отпадает необходимость в
Код:
Switch @NumParams ; ещё одна конструкция

Но на счет:
надо указывать "< 2"/"< 3"/"< 4"/"< 5" и т.д.
Почти забираю свои слова обратно))))))

2 @ll
Всем по пиву - автор угощает :beer:
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
А почему бы не
Код:
Const $mp3Dir = @ScriptDir&'\mp3'

ConsoleWrite(_InetGetURL2()&@CRLF)

Func _InetGetURL2($InetGetDir = $mp3Dir)
    Return $InetGetDir
EndFunc

?
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
C2H5OH
Вариант joiner - ответ #1

Он тебя опередил)))))

Вариант заслуживает особой похвалы и заслуги - но там надо использовать доп. переменную
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
и все-таки, почему при использовании символа & в параметрах функции выпадает ошибка синтаксиса?
уже очень хочется понять :smile:
 
Верх