2008年5月11日星期日

RailsCasts 006 symbol to proc

返回所有project的name,传统写法:
projects = Project.find(:all)
projects.collect { |p| p.name }
使用rails提供的shortcut:
projects.collect(&:name)
刚开始可能会觉得有点weird,不过习惯了就感觉很方便,还可以使用链式操作:
projects.collect(&:name).collect(&:downcase)
而且不止collect方法可以这样用,所有需要跟block的方法都可以用:
projects.all?(&:valid?)
projects.any?(&:valid?)
projects.each(&:save!)
意思是对每个project执行其save!方法,&后面跟的就是要执行的方法名称的symbol。
看完这个episode,不得不叹一句,编程就像是在说话一样,太强大了。

另外,在回复中有读者问到:如果&后的方法有argument的话,还能这样用吗?
作者的回复:Nope, it only works on very simple method calls which don't take an argument. Anything more complicated and you will need to use the full block.

还有老兄问能不能这样写:
ActorNames = Actor.find(:all).collect(&:last_name + ' ' + &:first_name)
作者推荐在actor model中定义一个full_name方法,然后调用这个方法:
ActorNames = Actor.find(:all).collect(&:full_name)

没有评论: