【问题标题】:Ruby: Assign output of a function only if it does not return nilRuby:仅当函数不返回 nil 时才分配函数的输出
【发布时间】:2012-11-03 11:28:56
【问题描述】:

在使用 Ruby 编程时,我经常会遇到如下任务

test = some_function if some_function

通过该分配,我想分配一个函数的输出,但如果它返回nil,我想保留变量的内容。我知道有条件赋值,但||=&&= 都不能在这里使用。我发现描述上述陈述的最短方式是

test = (some_function or test)

有没有更好/更短的方法来做到这一点?

【问题讨论】:

  • 这很重要,因为直到最近我才使用第一个版本,并且对函数进行了两次评估。因此第二个版本更好。由于我必须在我的代码中替换第一个版本,我只是想确保用处理这个问题的最佳方式替换它 - 或者可能是最佳实践。
  • 对我来说,这个问题值得提出,因为我得到了一个答案,它告诉我关于这个简单表达我不知道的三件事。首先,使用|| 而不是or。其次,考虑使用presence。第三,考虑功能方法。这超出了我的预期。

标签: ruby variable-assignment


【解决方案1】:

我认为没有比您显示的上一个 sn-p 更好的了,但请注意 or 用于流量控制,请改用 ||

test = some_function || test

通常最好为新名称分配新值,生成的代码更易于理解和调试,因为变量/符号在整个范围内具有相同的值:

some_different_and_descriptive_name_here = some_function || test

【讨论】:

  • 凭借多年的经验,我可以确认我的答案是错误的。
【解决方案2】:

我只是添加括号

(a = b) unless b.nil?

(a = b) if b

劣势是因为如果 b 为假,那么 a 仍然像以前一样

请记住,这会计算 b 两次,因此如果 b 是具有副作用的函数(例如更改其范围之外的变量或打印),它将执行两次;为避免这种情况,您必须使用

temp = b; (a = temp) unless temp.nil?

(当然也可以拆分成)

temp = b

(a = temp) unless temp.nil?

【讨论】:

    猜你喜欢
    • 2013-10-07
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    相关资源
    最近更新 更多