52

是否有一种在 Ruby 中编写每个块的单行方法?

cats.each do |cat|
   cat.name
end

我正在尝试缩短项目中的代码量。我正在使用 Ruby 1.9.2。

谢谢!

4

4 回答 4

77

是的,你可以写:

cats.each { |cat| cat.name }

或者简单地说

cats.each(&:name)

请注意,它Enumerable#each返回您正在迭代的相同对象(此处cats),因此您应该仅在您在块内执行某种副作用时使用它。最有可能的是,您想获得猫的名字,在这种情况下使用Enumerable#map代替:

cat_names = cats.map(&:name)
于 2012-06-12T07:16:38.813 回答
54

只需删除换行符:

cats.each do |cat| cat.name end

请注意,对于块,有两种不同的编码风格。一种编码风格表示始终使用do/end表示跨越多行的块,始终使用{/}表示单行块。如果你跟随那所学校,你应该写

cats.each {|cat| cat.name }

另一种风格是始终do/end用于主要针对其副作用执行的块和{/}用于主要针对其返回值执行的块。由于each丢弃了块的返回值,因此传递一个块的副作用才有意义,所以,如果你遵循那个学校,你应该用do/来写它end

但正如@tokland 提到的,更惯用的方式是写

cats.each(&:name)
于 2012-06-12T09:24:30.627 回答
16

我用于 rails 控制台/irb 的另一个技巧是用 ';' 分隔命令 例如

[1,2].each do |e| ; puts e; end
于 2012-06-12T12:34:48.323 回答
-1
for cat in cats;cat.name;end

那也应该这样做。

于 2017-04-26T18:44:11.777 回答