Arrays 构造一个包含条件逻辑的Ruby数组
如何在Ruby中构造一个数组,该数组仅在变量存在时使用变量,否则使用Arrays 构造一个包含条件逻辑的Ruby数组,arrays,ruby,Arrays,Ruby,如何在Ruby中构造一个数组,该数组仅在变量存在时使用变量,否则使用nil。使用数组构造函数中的条件逻辑 简化示例: a = 1 c = 3 arr = [a, b || nil, c] 我尝试了很多不同的方法,但都不起作用,所以我觉得我缺少了一些基本的东西 (无) b?b:无 b.nil?无:b 这可能吗 上下文: 此数组构造函数在多个不同模型使用的循环中使用。有些模型具有b属性,有些则没有,因此很难从外部推断逻辑。这将实现以下功能: arr = [a, b = b || nil, c]
nil
。使用数组构造函数中的条件逻辑
简化示例:
a = 1
c = 3
arr = [a, b || nil, c]
我尝试了很多不同的方法,但都不起作用,所以我觉得我缺少了一些基本的东西
(无)
b?b:无
b.nil?无:b
此数组构造函数在多个不同模型使用的循环中使用。有些模型具有
b
属性,有些则没有,因此很难从外部推断逻辑。这将实现以下功能:
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]
是的,您可以使用
defined?
方法。如果变量存在,则返回“局部变量”
,如果不存在,则返回nil
arr = [a, defined?(b) ? b : nil, c]
你可以做:
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
,则需要使用已定义?
:
> arr = [a, (defined?(b) ? b : nil), c]
=> [1, nil, 3]
假设您的
b
实际上是一个模型属性,当前的self
可能支持该属性,也可能不支持该属性,那么b
根本不是一个变量,b
是一个方法调用,您对“变量”是否存在不感兴趣,您感兴趣的是self
是否响应b
。因此,您希望使用:
或许:
arr = [a, respond_to?(:b, true) ? b : nil, c]
如果要允许b
成为非公共方法
defined?(b)
在这种情况下也应该起作用(除非b
的访问器方法是通过方法自动创建的
),但这对于任何查看您的代码的人来说都是相当令人费解的。使用respond\u to?
查看对象是否具有方法/属性将更为惯用
当遇到
方法缺失时,使用respond\u to?
当然假设方法缺失
和respond\u to?
都被覆盖,但这应该是一个相对安全的假设。。不要这样写代码。而是将其分解成更容易理解的部分:
a = 1
c = 3
b ||= nil
arr = [a, b, c]
或者,利用垂直空间帮助大脑了解发生了什么:
arr = [
a,
b ||= 3,
c
]
可以缩短为arr=[a,b | |=nil,c]
@Doon是的,很好,当我试图快速给出答案时,我错过了这些东西。不过我不会接受你的建议,因为另一个答案已经有了,但谢谢你。@sagarpandya82-继续更新吧。你不会冒犯我的。:)在代码回顾中,我会说arr=[a,b=b | | nil,c]不容易读取。而在C或Perl中,这种构造会飞起来,而在Ruby中,我们尝试更为明显。将其拆分为单独的行将有助于或预先分配b
,然后在数组中引用它。为什么b
不存在?这在Ruby代码中确实是一件不同寻常的事情。你说“如果变量存在,就使用它”和“一些模型有b
属性,而有些没有”。第一种说法是b
是一个变量,第二种说法是b
是一个方法调用,就是这样吗?真实的例子更类似于@instance.attribute\u b
。使用此逻辑的方法(分别)迭代多个不同模型的查询结果;有些模型没有属性。\u b
;这样一来,当一个压力很大的同事需要修复一个生产缺陷时,他就会在凌晨3点发疯。相反,将条件移到数组定义之外,以便清楚发生了什么,然后定义数组。或者,至少,将阵列分成几行,这样就有了一些垂直空间,便于大脑处理。arr=[a,defined?(b)?b:nil,c]
有点干净这是正确的答案,因为b
不能保证定义。@CDub我就是这样理解这个问题的。这里的问题是b
可能没有定义,但是调用b
方法仍然可以工作,考虑使用<代码>方法>缺失/代码>来根据需要创建访问器。不必在括号内括上表达式,逗号就足够了,但是为了可读性,我将每个元素放在一个单独的行中,这样就可以很容易地看到正在发生的事情。与简单的变量相比,读取和确定逻辑要容易得多……是的,但它是否应该是一行还是个问题。将其拆分为多行计算结果相同,不会降低速度,但会提高可读性。
arr = [
a,
b ||= 3,
c
]