Ruby中的每个块都可以有一行吗?

Goa*_*lie 42 ruby

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

cats.each do |cat|
   cat.name
end
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

tok*_*and 63

是的,你可以写:

cats.each { |cat| cat.name }
Run Code Online (Sandbox Code Playgroud)

或者干脆:

cats.each(&:name)
Run Code Online (Sandbox Code Playgroud)

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

cat_names = cats.map(&:name)
Run Code Online (Sandbox Code Playgroud)

  • `User.where(:email => /josh@josh.com /)。each(&:destroy)`。这里的“每个”都是有意义的,因为破坏是一种副作用。但是我会写:`User.destroy_all(:email => /josh@josh.com/)` (2认同)

Jör*_*tag 50

只需删除换行符:

cats.each do |cat| cat.name end
Run Code Online (Sandbox Code Playgroud)

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

cats.each {|cat| cat.name }
Run Code Online (Sandbox Code Playgroud)

另一种方式是始终使用do/ end作为主要针对其副作用执行的块和{/ }或主要针对其返回值执行的块.由于each扔掉块的返回值,它才有意义通过其副作用的块,所以,如果你按照那个学校,你应该把它与写do/ end.

但正如@tokland所提到的那样,写作的方式更为惯用

cats.each(&:name)
Run Code Online (Sandbox Code Playgroud)


小智 11

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

[1,2].each do |e| ; puts e; end
Run Code Online (Sandbox Code Playgroud)