Chinaunix首页 | 论坛 | 博客
  • 博客访问: 41611
  • 博文数量: 27
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 300
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-24 00:44
文章分类
文章存档

2011年(1)

2009年(26)

我的朋友
最近访客

分类: Java

2009-04-21 17:54:08

  1. class Project < ActiveRecord::Base  
  2.   has_many :tasks  
  3.   
  4.   def self.all_names  
  5.     find(:all).collect(&:name)  
  6.   end  
  7. end

看懂上面的方法没有?

为什么可以这么用呢:  find(:all).collect(&:name)?

&的作用是什么呢?

我们习惯的用法是:
find(:all).collect{|p| p.name}, 后面的collect方法将每一个对象执行.name方法,然后返回到一个数组中。

而&:name   的作用就是将name 方法转化成proc, 相当于 :name.to_proc
对,&:name 就是一个shortcut。

例如,你还可以这样使用:
projects.collect(&:name).collect(&:upcase)

这种技术当如不是限于collect方法自己,很多方法都可以:
projects.all?(&:valid?)
projects.any?(&:valid?)
projects.each(&:save!)

你可能已经发现了,将方法转化成proc之后,就不再使用{}了,而是改成像参数传递一样,使用:
( ) 了, 这可能就是引入这种做法的目的把。
阅读(391) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~