【问题标题】:What's a more idiomatic Ruby way of writing this?什么是更惯用的 Ruby 编写方式?
【发布时间】:2009-09-01 19:07:26
【问题描述】:
  if params[:parent_type] == "Order"
    parent_id = nil
  else
    parent_id = params[:parent_id]
  end

Ruby 人会因为我这样写而嘲笑我吗?它似乎不像我见过的一些 Ruby 代码那样特别简洁。

【问题讨论】:

    标签: ruby syntax idioms


    【解决方案1】:

    这在我看来完全合理。您可以将赋值移到 if (parent_id = if params...) 前面或使用三进制,但我认为结果不会更好。

    如果 parent_id 在该行之前为 nil 或未定义,您可以简单地编写:

    parent_id = params[:parent_id] unless params[:parent_type] == "Order"
    

    【讨论】:

    • awesome...这是红宝石做事的方式,任务在前面。这就是创建“除非”的原因,因此我们可以反过来使用相同的约定。
    【解决方案2】:

    按原样并没有什么问题,但可以更简洁:

    parent_id = (params[:parent_type] == "Order") ? nil : params[:parent_id]
    

    或者:

    parent_id = if (params[:parent_type] == "Order")
        nil
    else
        params[:parent_id]
    end
    

    【讨论】:

    • 那里有一个错字。 ">" 应该是 "?"
    • 我真的很喜欢第二个选项。清楚地表明这两个选项最终都会为 parent_id 赋值。
    • 三元形式总是分配一个值,这与“x = y 除非 z”形式不同,如果 x 已经被赋值(if-else 也是如此),它会单独留下 x。因此,如果您想要一个复制 if-else 形式的单行,请使用三元。
    【解决方案3】:

    我认为它的方式很好。我是一个 Ruby 人,我不会因为你这样写而嘲笑你。代码的作用很清楚,没有真正的代码重复,所以我不会担心。

    【讨论】:

      【解决方案4】:

      我喜欢:

      parent_id = (params[:parent_type] == "Order" ? nil : params[:parent_id])

      【讨论】:

        【解决方案5】:

        另一种变化:

        parent_id = (params[:parent_type] == "Order") && params[:parent_id]
        

        【讨论】:

        • 不是一种非常有表现力的方式.. 逻辑运算符不仅返回布尔值这一事实令人困惑......
        【解决方案6】:

        我们可以使用 Ruby 三元运算符。类似的东西:

        parent_id = params[:parent_type] == "Order" ? nil : params[:parent_id]
        

        如果parent_id 设置为nil 值,我们可以编写一个除非语法:

        parent_id = params[:parent_id] unless params[:parent_type] == "Order"
        

        或者以不同的方式编写一个简单的 Ruby if-else:

        parent_id = if (params[:parent_type] == "Order")
          nil
        else
          params[:parent_id]
        end
        

        要了解更多Idiomatic Ruby 的编码方式,我找到了一个awesome article

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-27
          • 2014-01-02
          • 2011-03-07
          • 1970-01-01
          • 2013-06-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多