【问题标题】:Idiomatic way of returning nil in Ruby在 Ruby 中返回 nil 的惯用方式
【发布时间】:2013-10-27 13:06:21
【问题描述】:

在 Ruby 中不显式返回 nil 是惯用的吗?让我们这样说:

def find_something data
    if data.has_what_we_need?
        a = data.something
        if a.has_what_we_want?
            a.the_stuff[42]
        end
    end
end

与这样的东西(可以说更吵)相反:

def find_something data
    if data.has_what_we_need?
        a = data.something
        if a.has_what_we_want?
            a.the_stuff[42]
        else
            nil
        end
    else
        nil
    end
end

【问题讨论】:

    标签: ruby return null idioms


    【解决方案1】:

    我尝试创建在不满足条件时尽早退出的方法,在缩进方面扁平化代码:

    def find_something data
      return unless data.has_what_we_need?
    
      a = data.something
    
      return unless a.has_what_we_want?
    
      a.the_stuff[42]
    end
    

    这有两个明确定义的退出点,因为return 在阅读它时应该显示为一个相当明显的东西。没有参数的return 将返回nil 给调用者。

    如果您不关心 nilfalse 的对比,您可以进一步压缩:

    def find_something data
      return unless data.has_what_we_need?
    
      a = data.something
    
      a.has_what_we_want? and a.the_stuff[42]
    end
    

    【讨论】:

    • 我喜欢用于流控制的后缀条件 - 以及降低缩进级别,如果它主要用于流控制(而不是像e = 3 if a.b? 这样的逻辑),那么它很快就会发现流阅读代码时的积分。
    【解决方案2】:

    我不知道与此相关的特定习语,但这可能更可取:

    def find_something data
        if data.has_what_we_need?
            a = data.something
            if a.has_what_we_want?
                return a.the_stuff[42]
            end
        end
    
        nil
    end
    

    【讨论】:

    • 谢谢。我尽量避免在 Ruby 中使用return(以及所有其他流中断语句)。每次看到return,我都觉得可以做得更好。
    • 有趣的是我同意。我几乎不会在 Java 中这样做,但在 Ruby 中似乎相当地道。我已经在我自己的代码中进行了相应的调整,但我明白你在说什么。
    • @detunized:从代码中的 3 行弹出的隐含结果似乎并没有好多少。有时,最好将一件事明确且易读于另一件事之上。被视为绝对的代码哲学可能会导致一些非常糟糕的代码(我最近看到的一些最糟糕的代码是由于将 DRY 置于所有其他考虑之上)。
    • 听起来@Neil 同意欧比旺的观点:youtube.com/watch?v=wgpytjlW5wU
    【解决方案3】:

    如果你的习惯用语是指默认情况下 ruby​​ 是否从方法返回 nil,那么不会。

    默认情况下,Ruby 方法返回执行的最后一条语句的值。如果您的最后一条语句解析为 nil,那么您的方法将返回 nil。

    我从您的示例中假设您希望一个方法在找到时返回一个值,但如果未找到则返回 nil。这样的事情可能会奏效:

    def find_something (i)
        a = ['boris', 'natasha', 'moose' ,'squirrel']
        a[i]
    end
    
    
    irb(main):020:0> find_something 4
    => nil
    irb(main):021:0> find_something 2
    => "moose"`
    

    数组a的索引结果就是返回值。

    希望这会有所帮助。

    【讨论】:

    • Ruby 中的默认方法是空的,空方法默认返回 nil。你需要在方法中实际写一些东西来改变它。我应该添加方法返回评估的最后一行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 2019-01-17
    相关资源
    最近更新 更多