我应该如何处理 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
以某种方式预初始化为 false
或 nil
,这会很好用,但不幸的是,如果 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
我遇到这样的情况:
# 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
以某种方式预初始化为 false
或 nil
,这会很好用,但不幸的是,如果 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