※ 引述《aquarianboy (高 見龍)》之銘言:
: ※ 引述《AIGecko (壁虎貓耳控)》之銘言:
: : 偶然忘了打函式只打了小括號
: : 發現.()等同.call()
: : ->(){print "hello, world"}.() #=>hello, world
: : ->(){print "hello, world"}.call() #=>hello, world
: : 不只是Proc
: : 其他物件只要有call這個方法都可以這樣用
: : class C
: : def call
: : print "hello, world"
: : end
: : end
: : C.new.() #=>hello, world
: : 這誰會發現啊...
: : 而且可讀性也不好...
: 講到這個,當初我在翻 Ruby Source Code 的時候有發現一段:
: // 檔案:proc.c
: rb_define_method(rb_cProc, "call", proc_call, -1);
: rb_define_method(rb_cProc, "[]", proc_call, -1);
: rb_define_method(rb_cProc, "===", proc_call, -1);
: rb_define_method(rb_cProc, "yield", proc_call, -1);
: 所以要執行 proc 的話,上面這四個方法是等義的:
: p = Proc.new { puts "hello, proc" }
: p.call
: p.[]
: p.===
: p.yield
: 才發現原來有這麼多種執行 proc 的方法 :)
好奇想問一下為什麼會把 === 也定義進去啊?
call
很好理解, 就是對 Proc 的一個 call 的動作,
javascript 的 function 也是有這個
[]
也可以懂, 因為 [] 應該是 ruby 裡面
唯一一個可以自由 overload 的「成對」的 operator
yield
我解讀為程式寫法視為 coroutine 的時候,
把控制權交給這個 Proc 的方式
可是.. === 是什麼情況用會看起來順啊?
把 Proc 視為一個 lazy deferred 的 value 嗎?
如果寫 thunk === 3 就是用來檢查這個 thunk 裡面的 value 是不是 3?
只是如果真是這樣的想法的話,
那麼其他的 + - * / 也都可以用同樣的理由定義進去才對呀?