For-loop [AHK_L 59+]

ÀÏ·ÃÀÇ ¸í·É¾î¸¦ °´Ã¼ ¾ÈÀÇ °¢ Å°-°ª ½Ö¸¶´Ù ÇÑ ¹ø¾¿ ¹Ýº¹ÇÕ´Ï´Ù.

For Key [, Value] in Expression

¸Å°³º¯¼ö

Key

°¢ ¹Ýº¹À» ½ÃÀÛÇÒ ¶§ Å°¸¦ ÀúÀåÇÒ º¯¼öÀÇ À̸§.

Value

ÇöÀç Å°¿¡ ¿¬°üµÈ °ªÀ» ÀúÀåÇÒ º¯¼öÀÇ À̸§.

Expression
°´Ã¼ ¶Ç´Â °´Ã¼¸¦ ´ã°í ÀÖ´Â º¯¼ö·Î °á°ú°¡ µÇ´Â

Ç¥Çö½Ä.

³íÆò

ExpressionÀº ȸµ¹ÀÌ°¡ ½ÃÀ۵DZâ Àü¿¡ ÇÑ ¹ø¸¸ Æò°¡µË´Ï´Ù. ±×ÀÇ °á°ú°¡ °´Ã¼°¡ ¾Æ´Ï¸é, ½ÇÇàÀº Áï½Ã ȸµ¹ÀÌ ¸öü ´ÙÀ½ ÁÙ·Î Á¡ÇÁÇÕ´Ï´Ù; ±×·¸Áö ¾ÊÀ¸¸é, ¿­°Å(enumerator) °´Ã¼¸¦ ¿­¶÷Çϱâ À§ÇÏ¿© ±× °´Ã¼ÀÇ _NewEnum() ¸Þ½îµå°¡ È£ÃâµË´Ï´Ù. °¢ ¹Ýº¹À» ½ÃÀÛÇÒ ¶§, ±× ¿­°Å °´Ã¼ÀÇ Next() ¸Þ½îµå¸¦ »ç¿ëÇÏ¿© ´ÙÀ½ Å°-°ª ½ÖÀ» ¿­¶÷ÇÕ´Ï´Ù. Next()°¡ 0 ¶Ç´Â ºó ¹®ÀÚ¿­À» µ¹·ÁÁÖ¸é, ȸµ¹ÀÌ°¡ ³¡³³´Ï´Ù.

for-ȸµ¹ÀÌ¿Í Á¤È®ÇÏ°Ô µ¿µîÇÏÁö´Â ¾ÊÁö¸¸, ´ÙÀ½ ¿¹Á¦´Â ÀÌ Ã³¸® °úÁ¤À» ½Ã¿¬ÇÕ´Ï´Ù:

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

±âÁ¸ÀÇ Å°-°ª ½ÖÀº ȸµ¹ÀÌ Áß¿¡ º¯°æÇÒ ¼ö ÀÖÁö¸¸, ±×·¯³ª Å°¸¦ »ðÀÔÇϰųª Á¦°ÅÇϸé Ç׸ñÀ» »©¸Ô°Å³ª ¿©·¯ ¹ø ¹Ýº¹ÇÏ´Â ¹®Á¦¸¦ ¾ß±âÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÑ °¡Áö ¿ìȸåÀº Á¦°ÅÇÒ Å° ¸ñ·ÏÀ» ¸¸µç ´ÙÀ½, ù ¹ø° ȸµ¹ÀÌ°¡ ¿Ï·áµÈ ÈÄ µÎ ¹ø° ȸµ¹À̸¦ »ç¿ëÇÏ¿© Å°¸¦ Á¦°ÅÇÏ´Â °ÍÀÔ´Ï´Ù. Object.Remove(first, last)¸¦ »ç¿ëÇØ È¸µ¹ÀÌ ¾øÀÌ ÇÑ ¹üÀ§ÀÇ Å°¸¦ Á¦°ÅÇÒ ¼ö ÀÖ´Ù´Â °Í¿¡ ÁÖ¸ñÇϽʽÿÀ.

for-ȸµ¹ÀÌ´Â º¸Åë ´ÙÀ½¿¡ ºí·ÏÀÌ µû¶ó¿É´Ï´Ù. ÀÌ ºí·ÏÀº ȸµ¹ÀÌÀÇ ¸öü¸¦ Çü¼ºÇÏ´Â ¼­¼ú¹®ÀÇ Áý´ÜÀÔ´Ï´Ù. ±×·¸Áö¸¸, ¼­¼ú¹®ÀÌ Çϳª¸¸ Àִ ȸµ¹ÀÌ´Â ºí·ÏÀ» ¿ä±¸ÇÏÁö ¾Ê½À´Ï´Ù ("if" ±×¸®°í ±×ÀÇ "else"´Â ÀÌ·± ¸ñÀûÀ¸·Î ÇϳªÀÇ ¼­¼ú¹®À¸·Î °è¼öµË´Ï´Ù). One True Brace (OTB) ½ºÅ¸ÀÏÀ» ¼±ÅÃÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ½ºÅ¸ÀÏÀº ¿©´Â È°°ýÈ£¸¦ ±× ¾Æ·¡°¡ ¾Æ´Ï¶ó °°Àº ÁÙ¿¡ ³ªÅ¸³ªµµ·Ï Çã¿ëÇÕ´Ï´Ù. ¿¹¸¦ µé¾î: for x, y in z {.

¸ðµç ȸµ¹ÀÌ¿Í ¸¶Âù°¡Áö·Î, Break, Continue ±×¸®°í A_Index¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

COM °´Ã¼

Å°(Key)¿Í °ª(Value)Àº ¿­°ÅÀÚÀÇ Next() ¸Þ½îµå¿¡ Á÷Á¢ °Ç³×Áý´Ï´Ù. °Å±â¿¡ ÇÒ´çµÇ´Â °ªÀº ¾î¶² Á¾·ùÀÇ °´Ã¼°¡ ¿­°ÅµÇ°í Àִ°¡¿¡ µû¶ó ´Ù¸¨´Ï´Ù. COM °´Ã¼¶ó¸é, Key¿¡´Â IEnumVARIANT::Next()°¡ µ¹·ÁÁÖ´Â °ªÀÌ ´ã±â°í Value¿¡´Â ±×ÀÇ variant À¯ÇüÀ» °¡¸®Å°´Â ¹øÈ£°¡ ´ã±é´Ï´Ù. ¿¹¸¦ µé¾î, Scripting.Dictionary °´Ã¼¿Í »ç¿ëµÉ ¶§, °¢ Key´Â »çÀüÀ¸·ÎºÎÅÍ ¿Â Å°°¡ ´ã±â°í Value´Â ÀüÇüÀûÀ¸·Î ¹®ÀÚ¿­¿¡ 8, Á¤¼ö¿¡ 3ÀÌ ´ã±é´Ï´Ù. À¯Çü ÄÚµå ¸ñ·ÏÀº ComObjType¸¦ ÂüÁ¶ÇϽʽÿÀ.

[v1.0.96.00+]: SafeArray¸¦ ¿­°ÅÇÒ ¶§, Key¿¡´Â ÇöÀç ¿ø¼Ò°¡ ´ã±â°í Value¿¡´Â ±×ÀÇ variant À¯ÇüÀÌ ´ã±é´Ï´Ù.

°ü·Ã Ç׸ñ

¿­°Å °´Ã¼, 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
; ¿­¸° Ž»ö â°ú ÀÎÅÍ³Ý ÀͽºÇ÷η¯ âÀ» ¸ðµÎ ³ª¿­ÇÕ´Ï´Ù:
for window in ComObjCreate("Shell.Application").Windows
    windows .= window.LocationName " :: " window.LocationURL "`n"
MsgBox % windows
/*
Class: CEnumerator

¼ýÄ¡ Å°¸¦ ¹Ýº¹ÇÏ´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ´Â ¹ü¿ë ¿­°Å °´Ã¼.
¹è¿­Àº ¹Ýº¹ Áß¿¡ º¯°æÇؼ­´Â ¾È µË´Ï´Ù. ±×·¸Áö ¾ÊÀ¸¸é, ¹Ýº¹ ¹üÀ§°¡ À¯È¿ÇÏÁö ¾Ê°Ô µË´Ï´Ù.
¹è¿­ °æ°è¿¡ ´ëÇÏ¿© ¸ÂÃã MaxIndex() ÇÔ¼ö¸¦ Á¤ÀÇÇÒ ¼ö ÀÖ½À´Ï´Ù.
1°ú ÃÖ´ë À妽º »çÀÌ¿¡ ºüÁø ¿ø¼Ò°¡ ÀÖ´Ù¸é, ¹Ýº¹µÇ±â´Â ÇÏÁö¸¸ °ªÀº ""°¡ µË´Ï´Ù.
ÀÌ°ÍÀº ÁøÂ¥ Èñ¼Ò Çà¿­Àº ÀÌ ¿­°Å °´Ã¼°¡ ¼³°è»ó Áö¿øµÇÁö ¾Ê´Â´Ù´Â ¶æÀÔ´Ï´Ù.
°´Ã¼°¡ ÀÌ ¹Ýº¹ÀÚ¸¦ »ç¿ëÇÏ°Ô ¸¸µé·Á¸é, ´ÙÀ½ ÇÔ¼ö¸¦ Ŭ·¡½º Á¤ÀÇ¿¡ »ðÀÔÇϽʽÿÀ:

    _NewEnum()
    {
    	return new CEnumerator(this)
    }

Source: 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 != ""
	}
}