Syntax 很难理解检索传递给函数中脚本的参数值的机制

Syntax 很难理解检索传递给函数中脚本的参数值的机制,syntax,autohotkey,Syntax,Autohotkey,脚本将两个参数值传递给脚本的另一个实例。因此,内置参数变量0包含传递的参数数。1在下面的示例“C:/Windows”中,2在“/switchtest”中 可以使用函数外的传统方法(使用单等号)将参数值分配给strParam1和strParam2。但是,在函数内部,赋值失败 如果在循环中使用:=符号分配它们,则它似乎可以工作 为什么?有人能解释这种行为吗 strParam1 = %1% strParam2 = %2% msgbox, 64, Outside the Function, number

脚本将两个参数值传递给脚本的另一个实例。因此,内置参数变量0包含传递的参数数。1在下面的示例“C:/Windows”中,2在“/switchtest”中

可以使用函数外的传统方法(使用单等号)将参数值分配给strParam1和strParam2。但是,在函数内部,赋值失败

如果在循环中使用:=符号分配它们,则它似乎可以工作

为什么?有人能解释这种行为吗

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
这对我来说是个谜。