作者CindyLinz (Cindy Wang)
看板Ruby
标题Re: [无用] .call()可省略call
时间Wed Jun 18 01:34:26 2014
※ 引述《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://webptt.com/cn.aspx?n=bbs/Ruby/M.1403026469.A.64F.html