我有这样的情况:
# 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
预先初始化为false
或nil
,这将非常有用,但不幸的是,如果author
未设置为某个有效实例(并且该有效实例也具有name
方法定义),那么我将得到:
NoMethodError:
undefined method `name' for nil:NilClass
而且不幸的是,ruby似乎并未将此类错误视为false
,它会停止执行。
关于如何实现此目标的任何想法?
(还添加了JavaScript stackoverflow标记,因为我也欢迎javascript解决方案!)
您可以只使用在2.3中引入Ruby的safe navigation operator:
def author_name
author&.name
end
请注意,您的示例中不需要self
。
或者当您使用Ruby on Rails时,您可能想使用delegate
:
delegate