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

问题描述 投票:0回答:1

我有这样的情况:

# 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,然后返回其名称,如果没有设置作者,则返回nil

但是,我希望能够用更少的代码来做到这一点,因为我经常遇到这样的情况:我想“ 如果存在的话就把它退回”。我不喜欢在退货之前先测试一下。||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 stackoverflow标记,因为我也欢迎javascript解决方案!)

javascript ruby conditional-operator or-operator
1个回答
3
投票

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

def author_name
  author&.name
end

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

或者当您使用Ruby on Rails时,您可能想使用delegate

delegate
© www.soinside.com 2019 - 2024. All rights reserved.