作者WanCW (旺小王)
看板Ruby
标题[心得] Symbol.to_proc 之应用
时间Sun May 13 18:05:53 2007
== 缘起
刚刚看到这篇
http://snippets.dzone.com:80/posts/show/4000 :
bad_dirs = Directory.find(:all, :conditions => ["description IS NULL"],
:order => "created_at").
collect(&:created_at)
才知道可以像黄色的部份那样子写。不过我在 irb 里试却试不出来,
跟学弟讨论也没有结果,不过他帮我找到这篇文章:
http://www.sitepoint.com/blogs/2006/06/19/insta-block-with-symbolto_proc/
== Symbol.to_proc
简单说,就是 Rails 从 0.14.4 之後,帮 Symbol 加上了 to_proc 这个 method,
让你可以把
articles.collect { |a| a.title }
写成
articles.collect(&:title)
相关的文件说明在
http://api.rubyonrails.org/classes/Symbol.html 。
到这边为止,我们知道怎麽把 Symobl 转成 Proc 物件了,
但是 & 跟 to_proc 中间好像还少了一些连结。
== & 与 to_proc
本来,我知道 functions / methods 在处理 block 时,可以用 & 来处理:
( block 就是一种 Proc 物件 )
def func_need_a_block(&blk) # 接受一个 block 并取名为 blk
....
end
func_need_a_block { } # 呼叫 function 时传递一个 block
甚至是用来再次传递 block (Proc 物件):
def func_pass_block(&blk)
func_need_a_block(&blk) # 把 blk 当作 block 而非一般参数来传递
end
如果你传递的 block 不是一个 Proc 物件呢?像是底下这样:
class C
......
end
c = C.new
func_need_a_block(&c)
遇到这种状况,Ruby 会先试着去呼叫 c.to_proc,尝试得到一个 Proc 物件,
如果成功,就把这个物件丢给 func_need_a_block。
但是 & 的作用只在标明这个变数是要当作 block 传递,
而不等於呼叫 to_proc,也就是说像下面这样写是不行的:
p = &obj_with_to_proc # Error!!
以上是对 Symbol.to_proc, &, to_ptoc 的简单整理。
== 更多 to_proc 的应用
有了上面所讲的 Symbol.to_proc,我们可以把常见的 mapping 动作:
>> list = ['1', '2', '3']
=> ["1", "2", "3"]
>> list.map {|item| item.to_i}
=> [1, 2, 3]
简化成:
>> list.map &to_i
=> [1, 2, 3]
但是有人觉得这样还是要打太多字了,他希望弄成这样:
>> list.to_is
=> [1, 2, 3]
想知道怎麽作吗?看这篇文章吧:
http://drnicwilliams.com/2006/09/28/new-magical-version-of-symbolto_proc/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.166.111.187