我应该如何处理 Ruby 中的条件测试可能会导致错误?

How should I handle a conditional in Ruby where the test could result in an error?

我遇到这样的情况:

# self refers to an instance of a Book class
self.author = instance_of_author_class                    #returns instance
self.author.name = instance_variable_in_author_instance   #returns string

# this is an instance method of the Book class:
def author_name
    self.author ? self.author.name : nil                  #returns string or nil
end

这段代码工作正常,因为它首先检查是否有 author 集,然后 return 其名称,或者 nil 如果没有设置作者。

但是,我希望能够用更少的代码来做到这一点,因为我发现我经常处于我想要“只是 return 的情况如果它存在”。我不喜欢在简单 returning 之前测试它。 || OR 表达式看起来很完美。

def author_name
    self.author.name || nil
end

如果 self.author.name 以某种方式预初始化为 falsenil,这会很好用,但不幸的是,如果 author 未设置为某个有效实例(并且该有效实例还定义了 name 方法),然后我将得到:

NoMethodError:
       undefined method `name' for nil:NilClass

而且不幸的是,ruby 似乎不会将此类错误视为 false,它会停止执行。

关于如何实现这个目标有什么想法吗?

(javascript Whosebug 标签也添加了,因为我也欢迎 javascript 解决方案!)

您可以只使用在 2.3 中引入到 Ruby 的 safe navigation operator

def author_name
  author&.name
end

请注意,您的示例中不需要 self

或者当您在 Rails 上使用 Ruby 时,您可能想要使用 delegate:

delegate :name, to: :author, prefix: true, allow_nil: true