함수 객체

"함수 객체"는 보통 다음을 뜻합니다:

함수 객체는 다음과 함께 사용할 수 있습니다:

사용자-정의 함수

사용자-정의 함수 객체는 다음 일반 패턴을 따라야 합니다:

class YourClassName {
    Call(a, b) {  ; 필요한 만큼 매개변수를 선언하거나, array*를 선언합니다.
        ;...
    }
    __Call(method, args*) {
        if (method = "")  ; For %fn%() or fn.()
            return this.Call(args*)
        if (IsObject(method))  ; 이 함수 객체가 메쏘드로 사용되면.
            return this.Call(method, args*)
    }
    ;...
}

정확하게 어느 부분이 필요한지는 사용법에 따라 다릅니다:

__Call으로 직접 같은 일을 할 수 있습니다. 그렇지만, __Call을 Call로 방향전환하기를 권장합니다. 쉽게 AutoHotkey v2로 이전할 수 있습니다. 오토핫키 v2에서 %this%()의 행위와 메쏘드 호출은 직접적으로 Call 메쏘드를 호출하도록 변경되었습니다.

예제

If you are defining multiple function object types, boilerplate code should be delegated to a base class (but if you'll ever combine your code with someone else's, be wary of conflicts). 예를 들어:

class FunctionObject {
    __Call(method, args*) {
        if (method = "")
            return this.Call(args*)
        if (IsObject(method))
            return this.Call(method, args*)
    }
}

The following example defines a function array which can be called; when called, it calls each element of the array in turn.

; This example requires the FunctionObject class above in order to work.
class FuncArrayType extends FunctionObject {
    Call(obj, params*) {
        ; 함수 리스트를 호출한다.
        Loop % this.Length()
            this[A_Index].Call(params*)
    }
}

; 함수 배열을 생성한다.
funcArray := new FuncArrayType
; Add some functions to the array (can be done at any point).
funcArray.Push(Func("One"))
funcArray.Push(Func("Two"))
; 배열을 메쏘드로 사용하는 객체를 생성한다.
obj := {method: funcArray}
; 메쏘드를 호출한다.
obj.method("foo", "bar")

One(param1, param2) {
    ListVars
    MsgBox
}
Two(param1, param2) {
    ListVars
    MsgBox
}

BoundFunc Object [v1.1.20+]

함수처럼 행위합니다. 그러나 그저 미리 정의된 매개변수를 다른 함수로 건네는 역할만 합니다.

두 가지 방법으로 BoundFunc 객체를 생성할 수 있습니다:

BoundFunc 객체는 아래 예제에 보여주는 바와 같이 호출할 수 있습니다. 다른 메쏘드는 지원하지 않습니다. BoundFunc가 호출될 때, 그에 묶인 함수나 메쏘드를 호출하면서, 묶인 매개변수와 그리고 호출자가 건넨 것을 모두 건넵니다. 예를 들어:

fn := Func("RealFn").Bind(1)

%fn%(2)    ; Shows "1, 2"
fn.Call(3) ; Shows "1, 3"

RealFn(a, b) {
    MsgBox %a%, %b%
}

ObjBindMethod()를 사용하면 메쏘드 자체를 가리키는 참조 주소를 열람할 수 없을 때 메쏘드에 묶을 수 있습니다. 예를 들어:

file := FileOpen(A_ScriptFullPath, "r")
getLine := ObjBindMethod(file, "ReadLine")
MsgBox % %getLine%()  ; 이 파일의 첫 줄을 보여줍니다.

For a more complex example, see SetTimer.