ahk变量与内置变量

变量

变量的类型: AutoHotkey 中没有明确的变量类型. 然而, 只包含数字 (可以含有小数点) 的变量进行数学运算或比较时, 会被自动转换为数值. (为了提高性能, 在内部会对数字进行缓存以避免与字符串之间的转换.)

变量的作用域和声明: 除了函数中的 局部变量, 其他所有变量都是全局的; 即可以在脚本的任意位置读取或修改它们的内容. 除了在函数页面注明的情况,变量都是不需要声明的;使用它们的时候它们就产生了(每个变量初始为空).

变量的名称: 变量名不区分大小写 (例如, CurrentDate 等同于 currentdate). 变量名可以含有多达 253 个字符, 并且可以由字母, 数字以及后面的标点组成: # _ @ $

考虑到命名的惯例, 通常在命名变量时最好仅使用字母, 数字和下划线 (例如: CursorPositionTotal_Items 和 entry_is_valid). 这样的风格可以让熟悉其他计算机语言的人更容易理解您的脚本. 而且, 如果您在 AutoHotkey 和其他语言中使用相同的风格, 您会发现能更容易重新读懂自己的脚本.

尽管变量名可以完全由数字组成, 但通常这样的名称仅用于 传入的命令行参数. 这样数值名称的变量不能用在 表达式 中, 因为它们会被看成是数字而不是变量.

因为单词 ANDOR 和 NOT 作为表达式的 运算符 使用, 所以通常不应该把它们用作变量名称. 在表达式中使用这样的名称会无法正确计算.

给变量赋值: 要把字符串或数字保存到变量中, 有两种方法: 传统方法和表达式方法. 传统方法使用 等号运算符 (=) 来指定 没有加引号的 原义字符串或包围在百分号中的变量. 例如:

MyNumber = 123
MyString = This is a literal string.
CopyOfVar = %Var%  ; 和 = 运算符一起使用时, 需要使用百分号来获取变量的内容.

与之相比, 表达式方法使用 冒号等号运算符 (:=) 来保存数字, 加引号的 字符串和其他类型的 表达式. 下面的例子在功能上与前面的例子相同:

MyNumber := 123
MyString := "This is a literal string."
CopyOfVar := Var  ; 和前面段落中与其作用相同的语句不同, 百分号不和 := 运算符一起使用.

后一种方法由于其更清晰并且与其他许多语言几乎一致的 表达式语法 成为大多数人的首选方法.

从上面的例子中您可能已经想到了有两种方法来清除变量的内容 (即让变量为空):

MyVar =
MyVar := ""

上面的这对空引号只能和 := 运算符一起使用, 因为和 = 运算符一起使用时, 则会在变量中保存两个原义的引号字符.

获取变量的内容: 如同赋值有两种方法, 获取变量的内容也有两种方法: 传统方法和表达式方法. 传统方法需要将变量名包围在百分号中来获取变量的内容. 例如:

MsgBox The value in the variable named Var is %Var%.
CopyOfVar = %Var%

与之相比, 表达式方法省去了变量名两边的百分号, 但原义的字符串必须包围在双引号中. 所以, 下面的表达式作用等同于上面的例子:

MsgBox % "The value in the variable named Var is " . Var . "."  ; 使用句点连接 (join 拼接) 两个字符串.
CopyOfVar := Var

在上面的 MsgBox 这行, 通过使用百分号和空格把参数从传统模式改变为表达式模式. 因为所有的命令默认情况下使用传统模式 (除了另外注明的那些), 所以这是必须的. 不过, 某些命令的特定参数已注明接受表达式, 此时前导的百分号可以省略. 例如, 下面的所有语句都是等效的, 因为 Sleep 的首个参数可以是表达式:

Sleep MillisecondsToWait
Sleep %MillisecondsToWait%
Sleep % MillisecondsToWait

变量的比较: 请阅读下面表达式部分中关于不同类型变量比较的重要提示, 尤其是关于何时使用小括号的内容.

表达式

表达式用来对一系列变量, 原义字符串和/或原义数字执行一个或多个操作.

表达式中的变量名称不用包围在百分号中(伪数组和其他的双重引用除外).所以, 为了与变量区别, 原义的字符串必须用双引号包围. 例如:

if (CurrentSetting > 100 or FoundColor <> "Blue")
    MsgBox The setting is too high or the wrong color is present.

在上面的例子中, 因为 "Blue" 是原义字符串, 所以包围在双引号中. 要在原义字符串中包含真实的引号字符,请指定两个连续的引号,如同此例中的两次演示:"She said, ""An apple a day.""".

重要说明:含有表达式的 if 语句与传统的 if 语句(例如 If FoundColor <> Blue),可以通过单词"if"后是否有开括号来区分.尽管通常把整个表达式包围在括号中,不过也可以写成这样:if (x > 0) and (y > 0).此外, 如果单词 "if" 后的第一项为 函数调用 或类似 "not" 或 "!" 这样的运算符时, 开括号可以完全省略.

空字符串: 要在表达式中使用空字符串, 请指定一对空引号. 例如,当 MyVar 非空时语句 if (MyVar <> "") 的结果为真.然而, 在 传统 if 语句 中, 一对空引号会被视为原义的字符串. 例如,当 MyVar 仅包含一对真实的引号时语句 if MyVar = "" 结果为真.因此,要使用传统的 if 语句判断变量是否为空,则需要让 = 或 <> 的右侧为空,例如:if Var =.

相关提示,任何无效的表达式例如 (x +* 3) 会产生空字符串.

保存表达式的结果: 要把结果赋值给变量, 请使用 := 运算符. 例如:

NetPrice := Price * (1 - Discount/100)

布尔值: 要计算表达式结果为真还是假时 (例如 IF 语句), 表达式结果为空或零被视为假, 而其他所有结果都视为真. 例如,仅当 ItemCount 为空或 0 时 if ItemCount 的结果才为假.类似地,表达式 if not ItemCount 将产生相反的结果.

像 NOT/AND/OR/>/=/< 这些运算符的运算会自动产生真值或假值的结果: 真值时结果为 1 而假值时为 0. 例如, 在下面的表达式中, 如果有一个条件为真则变量 Done 被赋值为 1:

Done := A_Index > 5 or FoundIt

如上面提示的那样, 简单地置空变量或为其赋值为 0 可以让它假值. 利用这种特性,可以使用简写语句 if Done 来检查变量 Done 是真还是假.

单词 true 和 false 是值分别为 1 和 0 的内置变量. 使用它们可以增加脚本的可读性, 例如:

CaseSensitive := false
ContinueSearch := true

整数和浮点数: 在表达式中, 含有小数点的数字被视为浮点数; 否则视为整数. 对于大多数运算符(例如加法和乘法),只要其中的一个输入是浮点数,那么结果也将是浮点数.

不论在表达式中还是在表达式外的其他地方, 整数都可以表示成十六进制或十进制. 十六进制数必须以前缀 0x 开头. 例如,Sleep 0xFF 等同于 Sleep 255.在 v1.0.46.11+,可以识别用科学计数法表示的浮点数;但只有在它们含有小数点时才行(例如 1.0e4 和 -2.1E-4).

强制使用表达式: 通过在表达式前加上百分号和空格或 tab, 能把表达式用在不直接支持表达式的参数中 (除了像 StringLen 的 OutputVar 和 InputVar 的那些参数). 这种技巧常用来访问 数组. 例如:

FileAppend, % MyArray%i%, My File.txt
FileAppend, % MyPseudoArray%i%, My File.txt
MsgBox % "The variable MyVar contains " . MyVar . "."
Loop % Iterations + 1
WinSet, Transparent, % X + 100
Control, Choose, % CurrentSelection - 1

表达式中的运算符

优先级相同的运算符例如乘 (*) 和除 (/) 按从左到右的顺序计算, 下面另行注明的除外. 与之相比, 低优先级的运算符例如加 (+) 在更高优先级的运算符例如 (*) 之后 计算. 例如, 3 + 2 * 2 等价于 3 + (2 * 2). 使用括号可以改变优先级, 例如: (3 + 2) * 2

除了下面注明的情况, 其他时候在数学运算中包含的任何空值 (空字符串) 或非数字值包括算术运算符中的都 不会 被假定为零. 而是被视为错误, 这将导致那部分表达式的计算结果为空字符串. 例如, 如果变量 X 为空, 那么表达式 X + 1 会返回空值而不是 1.

For historical reasons, quoted numeric strings such as "123" are always considered non-numeric when used directly in an expression (but not when stored in a variable or returned by a function). This non-numeric attribute is propagated by concatenation, so expressions like "0x" nalso produce a non-numeric value (even when n contains valid hexadecimal digits). This problem can be avoided by assigning the value to a variable or passing it through a function like Round(). Scripts should avoid using quote marks around literal numbers, as the behavior may change in a future version.

表达式运算符 (按优先级降序排列)

%Var%

如果表达式中的变量包围在百分号中 (例如 %Var%), 不管此变量 包含 什么内容都会被假定为另一个变量 (如果不存在这样的变量, 那么 %Var% 会被解析为空字符串) 的名称或部分名称. 这种方法常用来引用 伪数组 元素, 例如:

Var := MyArray%A_Index% + 100

为了向后兼容, 注明了 "可以使用表达式" 的命令参数把百分号中的孤立名称 (例如 %Var%, 但不是 Array%i%) 当作其两边的百分号不存在一样. 通过把引号包围在括号中可以避免这种情况;例如 Sleep (%Var%).

[AHK_L 52+]: 除了普通变量, %Var% 还可以解析为 环境变量, 剪贴板或任何的 保留/只读的变量. 在修订号 52 之前, 在这些情况中 %Var% 会被当成空字符串.

x.y [AHK_L 31+]: 对象访问. 从对象 x 中取值或为其存入值或调用其方法, 此处 y 是个原义值. 请参阅 对象语法.
new [v1.1.00+]:基于其他对象创建新对象.例如,x := new y 通常等价于 x := {base: y}.new 后应该跟着变量或 GlobalClass.NestedClass 形式的简单类名,还可以像 x := new y(z) 那样加上可选参数(其中 y 是变量而非函数名).更多细节请参阅自定义对象.
++
--
前置和后置的自增/自减. 从变量中增加或减去 1 (但在 1.0.46 之前的版本中, 只有把它们放在一行中才能用; 此行中不能使用其他运算符). 运算符可以放在变量名的前面或后面. 如果放在变量名的 前面, 会立即执行运算并把结果用于后面的运算. 例如,
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值