ruby为什么0 | | 1是0

ruby为什么0 | | 1是0,ruby,boolean,bitwise-operators,Ruby,Boolean,Bitwise Operators,运算符在第一个值为真时返回第二个值,在第一个值为假时返回第一个值 1 && 2 ---> 2 0 && 1 ---> 0 为什么OR操作在第一个值为false时不返回第二个值,而在第一个值为true时返回第一个值 0 || 1 ---> 0 1 || 0 ---> 1 OR和都是短路计算的,只要它们知道它们给您的表达式的值。 在Ruby中,0和1都是真的,它们都是真值。所以 0 | | 1是0 因为0是真的。 只要nil | | 1或f

运算符在第一个值为真时返回第二个值,在第一个值为假时返回第一个值

1 && 2 ---> 2
0 && 1 ---> 0
为什么OR操作在第一个值为false时不返回第二个值,而在第一个值为true时返回第一个值

0 || 1 ---> 0
1 || 0 ---> 1

OR和都是短路计算的,只要它们知道它们给您的表达式的值。 在Ruby中,0和1都是真的,它们都是真值。所以

0 | | 1是0

因为0是真的。
只要
nil | | 1
false | | 1
就会返回1。

或和都是短路计算的,只要他们知道他们给你的表达式的值。 在Ruby中,0和1都是真的,它们都是真值。所以

0 | | 1是0

因为0是真的。
只要
nil | | 1
false | | 1
将返回1。

|是一个逻辑运算符,而不是位运算符。与其他语言不同,例如C,0在ruby中不是一个“假”值

因为| |是一个短路逻辑运算符,所以您有以下等效语句:

定义值“0”| |定义值“1”

哪个ruby正确地计算为truthy表达式A | | truthy表达式B并返回truthy表达式A,即0

请看这里:


了解Python和Ruby中“Truthy”和“false”值的详细信息。

| |是一个逻辑运算符,而不是位运算符。与其他语言不同,例如C,0在ruby中不是一个“假”值

因为| |是一个短路逻辑运算符,所以您有以下等效语句:

定义值“0”| |定义值“1”

哪个ruby正确地计算为truthy表达式A | | truthy表达式B并返回truthy表达式A,即0

请看这里:


对于Python和Ruby中的“Truthy”和“false”值的良好概述,这里有两个方面:

  • 与其他语言不同,在Ruby中,
    0
    是真实的(这意味着它在布尔上下文中被计算为s true)
  • Ruby(
    |
    )中的OR运算符可以设置快捷方式并返回左参数(如果它是truthy)

  • 把这两个放在一起,你会发现
    0 | | 1
    返回
    0

    这里有两件事:

  • 与其他语言不同,在Ruby中,
    0
    是真实的(这意味着它在布尔上下文中被计算为s true)
  • Ruby(
    |
    )中的OR运算符可以设置快捷方式并返回左参数(如果它是truthy)

  • 把这两个放在一起,你会发现
    0 | | 1
    返回
    0
    Ruby在这样一个表达式中只计算它需要的值,然后停止,你看到返回的只是它计算的表达式的最后一部分。 因此,对于&&case,它必须一直运行到结尾,以防后面的子句返回false,从而导致and为false

    事实上,你的例子是错误的:

    irb> 0 && 1
    => 1
    
    这是意料之中的,因为0在Ruby中是真实的,不像在C中那么虚假

    对于OR的情况,它可以在碰到任何真实的东西时立即停止,而不需要对其余部分进行处理

    0 || false      # => 0
    false || 0      # => 0
    false || 0 || 2 # => 0
    
    如果要将这样的表达式强制为布尔表达式,通常会看到这样的操作:

    !!(expression)
    !!(0 || 1)        => true
    !!(nil || false)  => false 
    

    Ruby在这样的表达式中只计算所需的值,然后停止,您看到返回的只是它计算的表达式的最后一部分。 因此,对于&&case,它必须一直运行到结尾,以防后面的子句返回false,从而导致and为false

    事实上,你的例子是错误的:

    irb> 0 && 1
    => 1
    
    这是意料之中的,因为0在Ruby中是真实的,不像在C中那么虚假

    对于OR的情况,它可以在碰到任何真实的东西时立即停止,而不需要对其余部分进行处理

    0 || false      # => 0
    false || 0      # => 0
    false || 0 || 2 # => 0
    
    如果要将这样的表达式强制为布尔表达式,通常会看到这样的操作:

    !!(expression)
    !!(0 || 1)        => true
    !!(nil || false)  => false 
    

    0&&1
    返回
    1
    ,而不是
    0
    0&&1
    返回
    1
    ,而不是
    0