Re: [無用] .call()可省略call

看板Ruby作者 (Cindy Wang)時間10年前 (2014/06/18 01:34), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串4/6 (看更多)
※ 引述《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? 只是如果真是這樣的想法的話, 那麼其他的 + - * / 也都可以用同樣的理由定義進去才對呀? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 112.121.80.249 ※ 文章網址: http://www.ptt.cc/bbs/Ruby/M.1403026469.A.64F.html
文章代碼(AID): #1Je7mbPF (Ruby)
文章代碼(AID): #1Je7mbPF (Ruby)