1

在 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
4

3 回答 3

7

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

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在阅读它时应该显示为相当明显的事情。没有参数的 Areturn将返回nil给调用者。

如果你不关心nilvs.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
于 2013-10-18T16:03:02.197 回答
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
于 2013-10-18T15:58:58.710 回答
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 的结果是返回值。

希望这可以帮助。

于 2013-10-18T16:15:30.540 回答