length: 该方法返回数组中元素的数量

[].length #=> 0
["a", "b", "c"].length #=> 3

size: 打开ruby size文档,一句话 Alias for Array#length,所以和length使用和返回值都是一样的。

[].size #=> 0
["a", "b", "c"].size #=> 3

count: 该方法也是返回数组中元素的数量

[].count #=> 0
["a", "b", "c"].count #=> 3

但是count用法与上面有所不同

1. 可以传入一个参数, 统计数组中指定元素的数量:

["a", "b", "c", "c"].count("c")  #=> 2

2. 也可以传入一个block,统计符合block逻辑的元素的数量:

["a", "b", "c", "c"].count{|x| x=="c"}  #=> 2

Rails中对这几个方法进行了复写, 我们写几个语句对比了解下具体的使用方式:

  posts = user.posts  # sql select all records
  posts.length #=> 1  # no sql
  posts.size #=> 1    # no sql
  posts.count #=> 1   # run sql select again

通过上面的示例可以看到,在通过sql查询出posts之后,调用size和length表现是相同的,直接返回collection的数量,而调用count会再执行一次select count的sql查询。所以这种情况下,使用size或者length比count少一次查询,性能要好。

其它一些情况如这些方法也可以被String, Hash, Enumerator等方法调用,非常灵活,暂时就不展开了。