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

时间:2012-06-12 07:11:15

标签: ruby

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

cats.each do |cat|
   cat.name
end

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

谢谢!

4 个答案:

答案 0 :(得分:56)

是的,你可以写:

cats.each { |cat| cat.name }

simply

cats.each(&:name)

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

cat_names = cats.map(&:name)

答案 1 :(得分:50)

只需删除换行符:

cats.each do |cat| cat.name end

注意,在块方面有两种不同的编码风格。一种编码风格表示总是使用do / end来表示跨越多行的总是使用{ / {{1对于单行块。如果你跟着那所学校,你应该写

}

另一种风格是始终使用cats.each {|cat| cat.name } / do用于主要针对其副作用而执行的块end / {{1}对于主要为其返回值执行的块。由于{抛弃了块的返回值,因此只为其副作用传递一个块是有意义的,因此,如果您关注该学校,则应使用} / {{ 1}}。

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

each

答案 2 :(得分:11)

我用于rails console / irb的另一个技巧是将命令与';'分开。 e.g。

[1,2].each do |e| ; puts e; end

答案 3 :(得分:-2)

from django.db.models.expressions import RawSQL
qset = Foo.objects.annotate(category=RawSQL("select 'DEFAULT_CATEGORY'", ()))

也应该这样做。