Syntax 很难理解检索传递给函数中脚本的参数值的机制
脚本将两个参数值传递给脚本的另一个实例。因此,内置参数变量0包含传递的参数数。1在下面的示例“C:/Windows”中,2在“/switchtest”中 可以使用函数外的传统方法(使用单等号)将参数值分配给strParam1和strParam2。但是,在函数内部,赋值失败 如果在循环中使用:=符号分配它们,则它似乎可以工作 为什么?有人能解释这种行为吗Syntax 很难理解检索传递给函数中脚本的参数值的机制,syntax,autohotkey,Syntax,Autohotkey,脚本将两个参数值传递给脚本的另一个实例。因此,内置参数变量0包含传递的参数数。1在下面的示例“C:/Windows”中,2在“/switchtest”中 可以使用函数外的传统方法(使用单等号)将参数值分配给strParam1和strParam2。但是,在函数内部,赋值失败 如果在循环中使用:=符号分配它们,则它似乎可以工作 为什么?有人能解释这种行为吗 strParam1 = %1% strParam2 = %2% msgbox, 64, Outside the Function, number
strParam1 = %1%
strParam2 = %2%
msgbox, 64, Outside the Function, number of parameters:%0%`npath: %strParam1%`nswitch: %strParam2%
test_params()
strPath := "C:/Windows"
strSwitch := "/switchtest"
RunWait "%A_AhkPath%" "%A_ScriptFullPath%" "%strPath%" "%strSwitch%"
test_params() {
global 0
; this works
; loop %0%
; strParam%A_Index% := %A_Index%
; this causes an error: "This dynamic variable is blank. If this variable was not intended to be dynamic, remove the % symbols from it."
; strParam1 := %1%
; strParam2 := %2%
; this passes empty values; however, this method works outside the function.
strParam1 = %1%
strParam2 = %2%
msgbox, 64, Inside the Function, number of parameters:%0%`npath: %strParam1%`nswitch: %strParam2%
if strParam2
exitapp
}
您对
global 0
的想法是正确的;允许%0%从顶层带入函数。您也只需要声明global 1、2
即使这样做,也不能使用
:=
将它们分配给变量,因为:=
处理表达式,并且表达式中没有使用它们的语法(通常在表达式中仅引用变量名,而不使用%%
;显然1
和2
被解释为实际数字而不是变量).您对global 0
的想法是正确的;它允许%0%从顶层进入函数。您只需声明global 1、2
即使这样做,也不能使用
:=
将它们分配给变量,因为:=
处理表达式,并且表达式中没有使用它们的语法(通常一个变量在表达式中仅用变量名引用,没有%%
;显然1
和2
被解释为实际数字而不是变量)。@echristopherson回答了这个问题,但我想提出一个解决方法。这假设您使用的是自动热键
如果使用args“abc”运行测试脚本,它会给出以下信息
3
1, a
2, b
3, c
测试:
argv := args()
test := argv.MaxIndex() "`n"
for index,param in argv
test .= index ", " param "`n"
MsgBox % test
以及功能:
args() {
global
local _tmp, _out
_out := []
Loop %0% {
_tmp := %A_Index%
if _tmp
_out.Insert(_tmp)
}
return _out
}
@echristopherson回答了这个问题,但我想提出一个解决方案。这假设您使用的是自动热键 如果使用args“abc”运行测试脚本,它会给出以下信息
3
1, a
2, b
3, c
测试:
argv := args()
test := argv.MaxIndex() "`n"
for index,param in argv
test .= index ", " param "`n"
MsgBox % test
以及功能:
args() {
global
local _tmp, _out
_out := []
Loop %0% {
_tmp := %A_Index%
if _tmp
_out.Insert(_tmp)
}
return _out
}
我不明白。这并不能解释为什么如果使用了
循环%0%strParam%A_Index%:=%A_Index%
就不需要全局1,2
。在你的头脑中,用A、B和C替换0、1和2。如果你说“全局A”、“B”和“C”不是全局的,因为你没有要求他们。恐怕问题不清楚。我想知道为什么在循环中,没有必要为1和2声明全局,但在传统方法中赋值需要声明全局。哦,我明白了。是的,我希望在中为变量分配文本值1
和2
在循环的一边。这对我来说是个谜。我不明白。这并不能解释为什么如果使用了循环%0%strParam%a_Index%:=%a_Index%
就不需要全局1,2
。在你的头脑中,用a,B和C替换0,1,2。如果你说“全局a”,“B”和“C”不是全局的,因为你没有要求他们。恐怕问题不清楚。我想知道为什么在循环中,没有必要为1和2声明全局,但在传统方法中赋值需要声明全局。哦,我明白了。是的,我希望在中为变量分配文本值1
和2
这对我来说是个谜。