【问题标题】:Is it possible to have a one line each block in Ruby?Ruby中的每个块都可以有一行吗?
【发布时间】:2018-07-09 18:40:03
【问题描述】:

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

cats.each do |cat|
   cat.name
end

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

谢谢!

【问题讨论】:

  • 试试这个cats.each { |cat|猫名}

标签: ruby


【解决方案1】:

是的,你可以写:

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 do |user| user.destroy 结束
  • User.where(:email => /josh@josh.com/).each(&:destroy)。这里each 是有道理的,因为破坏是一种副作用。但我会写:User.destroy_all(:email => /josh@josh.com/)
【解决方案2】:

只需删除换行符:

cats.each do |cat| cat.name end

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

cats.each {|cat| cat.name }

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

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

cats.each(&:name)

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:
      for cat in cats;cat.name;end
      

      也应该这样做。

      【讨论】:

      • 这很丑,请看接受的答案。你应该避免“;”尽可能提高代码的可读性。或者至少在换行处添加空格。还有问题要求“阻止一个班轮”而不是。
      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      • 2018-07-25
      • 2013-02-27
      • 2011-07-20
      • 1970-01-01
      • 2015-07-16
      相关资源
      最近更新 更多