繁体   English   中英

在Ruby中返回nil的惯用方式

[英]Idiomatic way of returning nil in Ruby

在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

我尝试创建在不满足条件的情况下可以提早解决的方法,从而使代码在缩进方面变得平坦:

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

我不知道与此有关的特定用法,但这可能是更可取的:

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在默认情况下是否从方法返回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的结果是返回值。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM