在Ruby中返回nil的惯用方法

时间:2013-10-18 15:53:49

标签: ruby return null idiomatic

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

3 个答案:

答案 0 :(得分:6)

我尝试创建在条件不满足的情况下提前纾困的方法,在缩进方面使代码变得扁平化:

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

答案 1 :(得分: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

答案 2 :(得分:2)

如果通过惯用你的意思是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的结果是返回值。

希望这有帮助。