今天看的部分是Monkey C的callback function,
在js常常會使用到,但是用法好像沒這麼複雜...
雖然java也有類似的寫法,但原諒我學藝不精,平常又根本沒在用calllback function,只能邊看邊理解了
首先在Monkey C,通常不能直接使用其他class內的function,只能透過method
來實現,
以下方的官方釋例看,有個class叫做MyClass,裡面有個function叫operation
class MyClass {
function operation(a, b) {
//nothing
}
}
如果在其他地方要使用operation(a,b)
就必須先new一個MyClass的實例,
接著使用.method(:operation)來將operation這個function存進變數myObject
再來使用invoke
將參數傳入function,
這種間接的使用方式有點...不直覺...
function myFunction() {
// Create a new instance of MyClass
var myObject = new MyClass();
// Get a callback for the "operation" method from myObject
var myMethod = myObject.method(:operation);
// Invoke myObjects's "operation" method
myMethod.invoke(1, 2);
}
除了class內的function不可被其他人直接呼叫使用之外,在Monkey C,function也不能被拿來當作參數使用,
因此若要寫成callback function的寫法,因此也必須要仰賴.method(:function)來把function物件化,
變成物件之後,就可以透過參數傳遞了,
然後在這個物件上使用.invoke,來間接達到callback的效果。
補充:
如果要使用的function在module而不是在class,則要用以下寫法:
using Toybox.Lang as Lang;
module MyModule
{
function operation() {
// Some more amazing code. Only an infinite number of monkeys typing randomly over an
// infinite period of time could write something this good.
}
}
function myFunction() {
var myMethod = new Lang.Method(MyModule, :operation);
myMethod.invoke();
}
這是因為module不是物件,所以沒有繼承.method()這個方法,
所以要另外new一個Method物件,來將module內的function物件化