Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 构造一个包含条件逻辑的Ruby数组_Arrays_Ruby - Fatal编程技术网

Arrays 构造一个包含条件逻辑的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]

如何在Ruby中构造一个数组,该数组仅在变量存在时使用变量,否则使用
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
    ]