"함수 객체"는 보통 다음을 뜻합니다:
함수 객체는 다음과 함께 사용할 수 있습니다:
사용자-정의 함수 객체는 다음 일반 패턴을 따라야 합니다:
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*) } ;... }
정확하게 어느 부분이 필요한지는 사용법에 따라 다릅니다:
%this%()
나 this.()
를 사용했다면 method
는 빈 문자열입니다.IsObject(method)
는 참이고 method
에는 목표 객체를 가리키는 참조 주소가 담깁니다. 예를 들어, x.y
가 this
함수 객체를 가리키면, x.y()
→ this[x]()
→ this.__Call(x)
→ this.Call(x)
.__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 객체를 생성할 수 있습니다:
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.