【问题标题】:How should I handle a conditional in Ruby where the test could result in an error?我应该如何处理 Ruby 中测试可能导致错误的条件?
【发布时间】:2020-06-06 18:50:36
【问题描述】:

我有这样的情况:

# 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 未设置为某个有效实例(并且该有效实例也具有@987654330 @方法定义),然后我会得到:

NoMethodError:
       undefined method `name' for nil:NilClass

不幸的是,ruby 似乎不会将这样的错误视为false,它会停止执行。

关于如何实现这个目标的任何想法?

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

【问题讨论】:

  • “我也欢迎 javascript 解决方案” – 如果你有 Ruby 代码,这怎么可能有帮助?
  • @Stefan 我想我指的是使用嵌套错误处理“如果它存在就返回它”的一般问题。我觉得无论语言如何,我都会继续遇到这个问题,如果有必要,我也许可以将一些逻辑移交给不同的工具。

标签: javascript ruby conditional-operator or-operator


【解决方案1】:

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

def author_name
  author&.name
end

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

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

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

【讨论】:

  • 哇,感谢您的快速答复!我非常喜欢这个解决方案!回复:self,我喜欢明确地包含它,因为它决定了author 运行author 方法(获取实例变量@author)。我通常担心省略self 可能意味着author 是一些局部变量。根据您的经验,我的恐惧是没有根据的吗?最好还是不要害怕?
  • 当您同时拥有author 方法和author 局部变量时,调用author 当然会返回该变量。但是如果你没有这样的变量,那么就不需要self.
  • @Ben:普遍的看法是,如果您的作用域如此之大并且您的代码如此复杂以至于您甚至无法跟踪什么是局部变量和什么是方法,那么您拥有更大的甚至显式注释方法也无济于事的问题。
  • @Ben 使用了一个不错的编辑器/IDE,它能够检测和突出显示局部变量的语法。我强烈推荐 RubyMine。
  • @JörgWMittag 谢谢,是的,我的范围很小,我刚刚进入红宝石时代,并试图了解什么是常见做法(以及这种做法的基本原理),所以我可以保持一致:)
猜你喜欢
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 2018-08-11
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多