【问题标题】:Preferred way to write true AND false conditional in Ruby在 Ruby 中编写真假条件的首选方法
【发布时间】:2012-04-22 00:28:20
【问题描述】:

如果这个问题在某个地方得到了回答,我深表歉意,但我不确定我的措辞是否适合 Google,而且我还没有在任何风格指南中看到它。

既然 Ruby 有多种方法可以在条件中显示否定性,那么编写检查一部分为真另一部分为假的条件的首选方法是什么?示例:

if array && !array.include?('Bob')
  #do stuff!

但你也可以说:

if array
  #do stuff! unless array.include?('Bob')

或:

if array && not array.include?('Bob')
  #do stuff

或:

if !array.nil? && !array.include?('Bob')

或者一个古怪的双除非:

unless array.nil?
  #do stuff unless array.include?('Bob')

还有其他几个。有什么想法被认为是最 Rubyish 的吗?支持您观点的来源?

【问题讨论】:

标签: ruby coding-style logic


【解决方案1】:

就记录在案的指南而言,我唯一能想到的是 Google 指南,它告诫“不要使用 andor;始终使用 &&||。”。

除此之外,它在某种程度上取决于上下文。如果您所拥有的只是在一个条件为真而另一个条件为假的情况下要执行的代码,那么我肯定会将它们放在一个单独的 if 中 && !:

if array && !array.include?('Bob')
  #do stuff!

另一方面,如果第一个条件为真,即使第二个条件也为真,您也可能有额外的代码被执行;在这种情况下,嵌套的 unlessif 是有意义的:

if array 
    do stuff! unless array.include? 'Bob'
    do other stuff anyway
end

【讨论】:

  • 我认为整个“永远不要使用and/or”的教条是荒谬的。相反,know what they do 并在有意义时使用它们,就像使用任何其他语言功能一样。
  • 我倾向于同意,@AndrewMarshall。我只是参考了我能想到的唯一一个模糊相关的 Ruby 样式文档,这在我的脑海中很新鲜,因为优先级问题 recently confused someone else
  • 你对附加代码提出了一个很好的观点,@MarkReed,但我特别想的是单行示例。我认为,在您的情况下,附加代码的存在有助于形成更合乎逻辑的流程。
【解决方案2】:

不会提高可读性,但仍然很有趣。

如果你使用 Rails,你可以像这样使用 ActiveSupport try 扩展:

if array.try(:include?, 'Bob')
  # Do stuff

【讨论】:

  • Rails 也是特定的。我的是一个本地 Ruby 脚本,但我会在我处理的任何 Rails 项目中记下这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 2014-04-19
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多