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
答案 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
返回给调用者。
如果您不关心nil
与false
,您可以更加浓缩这一点:
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的结果是返回值。
希望这有帮助。