时间:2016-09-30 21:32:05

标签: arrays ruby

如何在Ruby中构造一个只使用变量(如果存在)的数组,否则在其位置使用nil。使用数组构造函数中的条件逻辑。

简化示例:

a = 1
c = 3

arr = [a, b || nil, c]

我尝试了许多不同的方式,但他们没有工作,所以我觉得我在这里缺少一些基本的东西。

  1. (b || nil)
  2. b ? b : nil
  3. b.nil? ? nil : b
  4. 这可能吗?

    上下文 此数组构造函数用于多个不同模型使用的循环内。有些模型具有b属性,有些则没有,因此难以推断外部逻辑。

5 个答案:

答案 0 :(得分:3)

是的,您可以使用defined?方法。如果存在变量,则返回"local-variable",否则返回nil

arr = [a, defined?(b) ? b : nil, c]

答案 1 :(得分:2)

鉴于您的b实际上是当前self可能支持或不支持的模型属性,那么b根本不是变量,b是一种方法调用,您对"变量"是否感兴趣。存在,您对self是否回复b感兴趣。因此,您想使用respond_to?

arr = [a, respond_to?(:b) ? b : nil, c]

或者也许:

arr = [a, respond_to?(:b, true) ? b : nil, c]

如果您想允许b成为非公开方法。

defined?(b)也适用于这种情况(除非b的访问者方法是通过method_missing自动创建的),但对于任何查看代码的人来说都会令人费解。使用respond_to?来查看对象是否具有方法/属性会更加惯用。

当遇到respond_to?时,method_missing假设method_missingrespond_to?已被覆盖,但这应该是一个相对安全的假设。

答案 2 :(得分:0)

这样可以解决问题:

arr = [a, b = b || nil, c]

示例1:

a = 1
c = 3

arr = [a, b = b || nil, c]
p arr #=> [1, nil, 3]

示例2:

a = 1
b = 2
c = 3

arr = [a, b = b || nil, c]
p arr #=> [1, 2, 3]

答案 3 :(得分:0)

你可以这样做:

arr = [a, (b ||= nil), c]

示例:

a = 1
b = nil
c = 3

> arr = [a, (b ||= 33), c]
=> [1, 33, 3]

b = 2

> arr = [a, (b ||= 33), c]
=> [1, 2, 3]

如果无法定义b,则您需要使用defined?

> arr = [a, (defined?(b) ? b : nil), c]
=> [1, nil, 3]

答案 4 :(得分:0)

唉。不要写那样的代码。而是将其分解为更易理解的部分:

a = 1
c = 3

b ||= nil

arr = [a, b, c]

或者,使用垂直空间来帮助大脑了解正在发生的事情:

arr = [
  a,
  b ||= 3,
  c
]