AutoHotKey 中数组的随机发送
Random sending of array in AutoHotKey
我正在尝试创建一个 AHK 脚本,它会在我输入 'diss' 时输入随机侮辱。但是,目前,我每次输入 'diss' 时得到的都是 "Array[rand]"。
我做错了什么?
Array:= Object()
Loop, Read, C:\Users\dell\Desktop\insults.txt
{
Array.Insert(A_LoopReadLine)
}
::diss::
Random, rand, 0, 3
Send, Array[rand]
Return
您忘记用分号设置数组名称 -> %A_index%
fileread,contents,C:\Users\dell\Desktop\insults.txt
Loop, parse, contents, `n, `r
{
array%a_index% := A_LoopField
}
return
::diss::
Random, rand, 1, 3
tosend = array%rand%
tosend = % %tosend%
Send, %tosend%
Return
修复了多个问题..
1.try 读入变量
2.arrays可以作为变量名
3.varaible 名称可以包含变量
如果我的代码对你有用,以及你是否理解,请反馈。
/edit 我修复了代码并对其进行了测试。
供您参考,如果变量在变量中,我将名称嵌套。
ahk 魔法
Deceiving_Solicitite 在技术上是正确的...但我觉得他没有很好地解释他的代码,坦率地说,Hisham 的代码写得更好,即使它是错误的(只有 2 个小细节)。说了这么多,让我们开始编码吧。
第一个突然出现的问题是您的发送命令。让我们尝试将 Send, Array[rand]
更改为 Send % Array[rand]
,现在代码大部分时间都可以工作...
But what does this mean?
注意到 % 标志了吗?这是在对通常不计算表达式的命令强制执行表达式。 Arrays/Objects 在 AHK 中被视为如此,Command 将无法识别它们。
This still doesn't explain why the code only "works most of the
time..."
事实证明,他生成的随机数也存在一个小问题。将值插入数组时,它们会从 1 开始递增索引,而且他的随机数有时会产生零。因此,我们现在将该行从更改为 Random, rand, 1, 3
,此时代码已修复并且 %100 的时间有效。
But what if he wanted to have more insults than 3? Will he have to go through
and count every line and amend his Random command?
这很愚蠢,因为我们可以让计算机为我们做这件事,因为它计算文本行数的速度比我们快得多。因此,我们只需让我们的 Random 产生介于 1 和数组的最大索引之间的结果,如下所示: Random, rand, 1, % Array.MaxIndex()
。注意百分比?我们再次强制命令进行评估和表达。整洁吧?
完成代码:
Array:= Object()
Loop, Read, C:\Users\dell\Desktop\insults.txt
{
Array.Push(A_LoopReadLine)
}
::diss::
Random, rand, 1, % Array.MaxIndex()
Send % Array[rand]
Return
我希望你从中学到了东西。
编辑:将 Array.Insert()、deprecated 更改为 Array.Push()。
我正在尝试创建一个 AHK 脚本,它会在我输入 'diss' 时输入随机侮辱。但是,目前,我每次输入 'diss' 时得到的都是 "Array[rand]"。
我做错了什么?
Array:= Object()
Loop, Read, C:\Users\dell\Desktop\insults.txt
{
Array.Insert(A_LoopReadLine)
}
::diss::
Random, rand, 0, 3
Send, Array[rand]
Return
您忘记用分号设置数组名称 -> %A_index%
fileread,contents,C:\Users\dell\Desktop\insults.txt
Loop, parse, contents, `n, `r
{
array%a_index% := A_LoopField
}
return
::diss::
Random, rand, 1, 3
tosend = array%rand%
tosend = % %tosend%
Send, %tosend%
Return
修复了多个问题..
1.try 读入变量
2.arrays可以作为变量名
3.varaible 名称可以包含变量
如果我的代码对你有用,以及你是否理解,请反馈。
/edit 我修复了代码并对其进行了测试。
供您参考,如果变量在变量中,我将名称嵌套。 ahk 魔法
Deceiving_Solicitite 在技术上是正确的...但我觉得他没有很好地解释他的代码,坦率地说,Hisham 的代码写得更好,即使它是错误的(只有 2 个小细节)。说了这么多,让我们开始编码吧。
第一个突然出现的问题是您的发送命令。让我们尝试将 Send, Array[rand]
更改为 Send % Array[rand]
,现在代码大部分时间都可以工作...
But what does this mean?
注意到 % 标志了吗?这是在对通常不计算表达式的命令强制执行表达式。 Arrays/Objects 在 AHK 中被视为如此,Command 将无法识别它们。
This still doesn't explain why the code only "works most of the time..."
事实证明,他生成的随机数也存在一个小问题。将值插入数组时,它们会从 1 开始递增索引,而且他的随机数有时会产生零。因此,我们现在将该行从更改为 Random, rand, 1, 3
,此时代码已修复并且 %100 的时间有效。
But what if he wanted to have more insults than 3? Will he have to go through and count every line and amend his Random command?
这很愚蠢,因为我们可以让计算机为我们做这件事,因为它计算文本行数的速度比我们快得多。因此,我们只需让我们的 Random 产生介于 1 和数组的最大索引之间的结果,如下所示: Random, rand, 1, % Array.MaxIndex()
。注意百分比?我们再次强制命令进行评估和表达。整洁吧?
完成代码:
Array:= Object()
Loop, Read, C:\Users\dell\Desktop\insults.txt
{
Array.Push(A_LoopReadLine)
}
::diss::
Random, rand, 1, % Array.MaxIndex()
Send % Array[rand]
Return
我希望你从中学到了东西。
编辑:将 Array.Insert()、deprecated 更改为 Array.Push()。