For 循环 [AHK_L 59+]

优质
小牛编辑
128浏览
2023-12-01

对对象中的每对键值对重复执行一系列命令。

For Key [, Value] in Expression

参数

在每次重复开始时用来保存键的变量名称.

保存与当前键关联的值的变量名.

Expression

结果为对象的 表达式 或包含对象的变量.

备注

只在循环开始前计算一次 表达式. 如果其结果不是对象, 则立即跳转到循环体后面的语句执行; 否则, 调用对象的 _NewEnum() 来获取 枚举数 对象. 每次重复开始时, 使用枚举数的 Next() 方法获取下一个键值对. 如果 Next() 返回零或空字符串, 则循环终止.

尽管不完全等同于 for 循环, 不过下面演示了近似于它的循环过程:

_enum := (Expression)._NewEnum()
if IsObject(_enum)
    while _enum.Next(Key, Value)
    {
        ...
    }

现有的键值对可以在循环中修改, 但插入或移除键可能导致一些项目被跳过或枚举多次. 一种解决方法是建立待移除的键列表, 在首个循环结束后使用第二个循环来移除这些键. 请注意使用 Object.Remove(first, last) 可以直接移除键的范围而不需要循环.

for 循环后通常跟着 区块, 这是构成循环 的语句的集合. 不过, 在单语句的循环中可以不使用区块 (用于此目的时 "if" 与其相匹配的 "else" 一起被视为单语句). 可以使用 One True Brace (OTB) 风格, 这样允许左大括号与 while 在同一行而不是在其下面. 例如:for x, y in z {

和所有的循环一样, 循环中可以使用 Break, ContinueA_Index.

COM 对象

因为 KeyValue 被直接传递给枚举数的 Next() 方法, 所以它们的值取决于被枚举的对象类型. 对于 COM 对象, Key 包含由 IEnumVARIANT::Next() 返回的值, 而 Value 包含了表示其 变量类型 的数字. 例如, 用于 Scripting.Dictionary 对象时, 每个 Key 包含字典中的键而 Value 通常为 8 (对于字符串) 和 3 (对于整数). 请参阅 ComObjType 了解类型代码表.

[v1.0.96.00+]: 枚举 SafeArray 时, Key 包含了当前元素而 Value 包含其变量类型.

相关

枚举数对象, Object.NewEnum(), While 循环, Loop, Until, Break, Continue, 区块

示例

; 列出对象中的键值对:
colours := Object("red", 0xFF0000, "blue", 0x0000FF, "green", 0x00FF00)
; 上面的表达式可以直接代替下面的“colours”:
for k, v in colours
    s .= k "=" v "`n"
MsgBox % s
; 列出所有的资源管理器和 Internet Explorer 窗口:
for window in ComObjCreate("Shell.Application").Windows
    windows .= window.LocationName " :: " window.LocationURL "`n"
MsgBox % windows
/*
Class: CEnumerator

能用来循环数值键的通用枚举器对象。在循环中不能修改数组,否则循环的区间可能出错。可以定义自己的 MaxIndex() 函数来表示数组边界。如果在 1 和最大索引间有缺失的数组成员,仍会循环到它们但值为空。这是说这个枚举器被设计为不支持真正的数组解析。要在对象能使用这种循环,请在它的类定义中插入这个函数:

    _NewEnum()
    {
    	return new CEnumerator(this)
    }

来源:http://www.autohotkey.com/board/topic/2667-suggestions-on-documentation-improvements/?p=531509
*/

; 对枚举器进行循环
For k, v in Test
	MsgBox %k%=%v%

; 用于演示的测试类
class Test
{
	static Data := ["abc", "def", "ghi"]

	_NewEnum()
	{
		return new CEnumerator(this.Data)
	}
}

class CEnumerator
{
	__New(Object)
	{
		this.Object := Object
		this.first := true
		; 加速的缓存。当 MaxIndex() 函数性能差时用得上。
		; 副作用是在循环时不能插入键值对,否则区间是错误的。
		this.ObjMaxIndex := Object.MaxIndex()
	}

	Next(ByRef key, ByRef value)
	{
		if (this.first)
		{
			this.Remove("first")
			key := 1
		}
		else
			key ++
		if (key <= this.ObjMaxIndex)
			value := this.Object[key]
		else
			key := ""
		return key != ""
	}
}

最后更新:

类似资料

  • 您好,我对jquery没有什么问题。首先,我有: 大众BORA 1.9TDI 1990 1995 奥迪A3 2.0TFSI 2006 2008 但我想实现: VW BORA 1.9TDI 1990 VW BORA 1.9TDI 1991 VW BORA 1.9TDI 1992 VW BORA 1.9TDI 1993 VW BORA 1.9TDI 1994 VW BORA 1.9TDI 1995 A

  • 问题内容: 我第一次不了解PHP。我一直在脚本中使用for循环,while循环,foreach循环。我想知道 哪一个性能更好? 选择循环的标准是什么? 当我们在另一个循环中循环时应该使用哪个? 我一直想知道要使用哪个循环的代码。 很明显,我可以使用while编写上面的代码。希望有人能帮助我找出哪个循环更适合使用。 问题答案: 哪一个性能更好? 没关系 选择循环的标准是什么? 如果只需要遍历对象或数

  • 通常你想在一个任务中干很多事,比如创建一群用户,安装很多包,或者重复一个轮询步骤直到收到某个特定结果. 本章将对在playbook中如何使用循环做全面的介绍. Topics 循环 为了保持简洁,重复的任务可以用以下简写的方式: - name: add several users user: name={{ item }} state=present groups=wheel with_it

  • 循环其实不足为奇。跟其它程序设计语言一样,bash中的循环也是只要控制条件为真就一直迭代执行的代码块。 Bash中有四种循环:for,while,until和select。 for循环 for与它在C语言中的姊妹非常像。看起来是这样: for arg in elem1 elem2 ... elemN do # 语句 done 在每次循环的过程中,arg依次被赋值为从elem1到elemN。这些

  • 尽管已经支持JavaScript原生代码,Jade还是支持了一些特殊的标签,它们可以让模板更加易于理解,其中之一就是each, 这种形式: each VAL[, KEY] in OBJ 一个遍历数组的例子 : - var items = ["one", "two", "three"] each item in items li= item 渲染为: <li>one</li> <li>two</

  • 可能存在需要多次执行代码块的情况。 通常,语句按顺序执行:首先执行函数中的第一个语句,然后执行第二个语句,依此类推。 编程语言提供各种控制结构,允许更复杂的执行路径。 循环语句允许我们多次执行语句或语句组,以下是大多数编程语言中循环语句的一般形式 - Perl编程语言提供以下类型的循环来处理循环要求。 Sr.No. 循环类型和描述 1 while 循环 在给定条件为真时重复语句或语句组。 它在执行