ruby-on-rails - 如何在一行中写条件语句? rails

标签 ruby-on-rails ruby refactoring

我想说的是

self.preferred_amount * object.each{|li|li.variant}.collect{|li|li.weight}

唯一的问题是某些权重等于零。

既然如此,我想补充一点,如果它们等于 nil,则使它们等于 0。

有什么办法可以将这个逻辑合并到同一行中吗?

或者有什么方法可以让这个声明比现在更加重构?

最佳答案

li.weight 更改为 li.weight || 0

|| 是“短路或”运算符。如果其左侧为真(既非假也非零),则返回左侧,否则返回右侧。

MRI >= 1.8.7 中有一项功能可以让您简化此内容。而不是:

each{|li|li.variant}

你可以写

each(&:variant)

在 1.8.7 之前的 Ruby 版本中,需要向后移植 gem 才能获得此功能。

比这更好的是,将所有逻辑移动到对象的类中,例如

class Whatever
  def variant_weights
    each(&:variant).collect{ |li| li.weight || 0}
  end
end

并使用它:

self.preferred_amount * object.variant_weights

但是请注意,将标量乘以数组是一个错误。如果您想对权重求和,则:

class Whatever
  def total_variant_weights
    each(&:variant).collect{ |li| li.weight || 0}.inject(&:+)
  end
end

并使用它:

self.preferred_amount * object.total_variant_weights

关于ruby-on-rails - 如何在一行中写条件语句? rails ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4628401/

相关文章:

ruby-on-rails - 无法使用 Capistrano 删除旧版本

ruby-on-rails - 为什么 erb 的 <%= %> 中不允许使用#comment 语法?

javascript - 将 Rails JSON 与 JQuery 一起使用的简单示例?

java - 有没有办法在 Ruby 中强制执行接口(interface)方法?

ruby - 是否有像 PyDev for Python 这样的 Ruby 独立 Eclipse 插件?

ruby - 比较二维数组

java - Eclipse:将导入添加到一堆类中

Java ExecutorService 任务生成

ruby-on-rails - heroku 上的多线程 ruby​​ worker

c# - 批量重构 C#