【发布时间】:2018-07-09 18:40:03
【问题描述】:
是否有一种用 Ruby 编写每个块的单行方法?
cats.each do |cat|
cat.name
end
我正在尝试缩短项目中的代码量。我正在使用 Ruby 1.9.2。
谢谢!
【问题讨论】:
-
试试这个cats.each { |cat|猫名}
标签: ruby
是否有一种用 Ruby 编写每个块的单行方法?
cats.each do |cat|
cat.name
end
我正在尝试缩短项目中的代码量。我正在使用 Ruby 1.9.2。
谢谢!
【问题讨论】:
标签: ruby
是的,你可以写:
cats.each { |cat| cat.name }
或simply:
cats.each(&:name)
请注意,Enumerable#each 返回的对象与您正在迭代的对象相同(此处为 cats),因此只有在块内执行某种副作用时才应使用它。很可能,您想获取猫的名字,在这种情况下使用 Enumerable#map 代替:
cat_names = cats.map(&:name)
【讨论】:
User.where(:email => /josh@josh.com/).each(&:destroy)。这里each 是有道理的,因为破坏是一种副作用。但我会写:User.destroy_all(:email => /josh@josh.com/)
只需删除换行符:
cats.each do |cat| cat.name end
请注意,块有两种不同的编码风格。一种编码风格总是对跨越多行的块使用do/end,总是对单行块使用{/}。如果你跟着那所学校,你应该写
cats.each {|cat| cat.name }
另一种风格是总是将do/end用于主要针对其副作用执行的块,而{/}用于主要针对其执行的块他们的返回值。由于each 丢弃了块的返回值,因此传递一个块只是因为它的副作用才有意义,所以,如果你遵循那所学校,你应该用do/end 编写它。
但正如@tokland 提到的,更惯用的方式是写
cats.each(&:name)
【讨论】:
我用于 rails 控制台/irb 的另一个技巧是用 ';' 分隔命令例如
[1,2].each do |e| ; puts e; end
【讨论】:
for cat in cats;cat.name;end
也应该这样做。
【讨论】: