如何在Ruby中构造一个只使用变量(如果存在)的数组,否则在其位置使用nil
。使用数组构造函数中的条件逻辑。
简化示例:
a = 1
c = 3
arr = [a, b || nil, c]
我尝试了许多不同的方式,但他们没有工作,所以我觉得我在这里缺少一些基本的东西。
(b || nil)
b ? b : nil
b.nil? ? nil : b
这可能吗?
上下文
此数组构造函数用于多个不同模型使用的循环内。有些模型具有b
属性,有些则没有,因此难以推断外部逻辑。
答案 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_missing
和respond_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
]