Ruby ||及&;不是';对象上的t方法——它们是什么?

Ruby ||及&;不是';对象上的t方法——它们是什么?,ruby,Ruby,单管“或”|作为方法存在于TrueClass和FalseClass上,但短路|操作符不存在。它也不是对象上的方法 这似乎是ruby“一切都是对象”比喻的一个例外 主要问题:从语法上讲,什么是|和&?它们只是一些全局语法吗 第二个问题:我认为这不是主要问题的一部分,因为这可能是主观的,尽管我怀疑可能不是 这种不对称现象是否有语言设计或性能方面的原因?在我看来,这两个操作符都可以作为对象上的方法实现。比如: class Object def short_circuit_or(other)

单管“或”
|
作为方法存在于
TrueClass
FalseClass
上,但短路
|
操作符不存在。它也不是
对象
上的方法

这似乎是ruby“一切都是对象”比喻的一个例外

主要问题:从语法上讲,什么是
|
&
?它们只是一些全局语法吗

第二个问题:我认为这不是主要问题的一部分,因为这可能是主观的,尽管我怀疑可能不是

这种不对称现象是否有语言设计或性能方面的原因?在我看来,这两个操作符都可以作为
对象上的方法实现。比如:

class Object
  def short_circuit_or(other)
    !nil?       ? true : 
    !other.nil? ? true : false
  end
end

我想这是有原因的。这是什么?

|
都是
|
是该语言的一部分,而
|
是由某些类(、和)作为方法实现的

在编程语言中,
|
通常用作运算符。它组合整数操作数的位并生成一个新的整数值。当与非整数操作数一起使用时,某些语言会将其转换为整数,而其他语言则禁止此类使用

|
是运算符。它组合两个布尔值(
true
false
)并生成另一个布尔值。当其操作数不是布尔值时,某些语言会将其转换为布尔值。Ruby(以及JavaScript和其他语言)将其第一个操作数计算为布尔值,如果其布尔值为
true
,则表达式的值为其第一个操作数的值;如果其第一个操作数的逻辑值为
false
,则表达式的值为其第二个操作数的值。结果值的类型是其原始类型,不会转换为布尔值

每种语言都使用自己的规则来决定哪些非布尔值被转换为
false
(通常是数字
0
、空字符串
'
null
未定义的
);所有其他值都转换为
true
。Ruby中唯一的“false”值是
false
(布尔值)和
nil
(非布尔值);所有其他值(包括
0
)均为“真”

因为和,包括Ruby在内的许多编程语言都实现了对逻辑表达式的短路求值

使用,逻辑表达式将从左向右求值,每次求值一个操作数,直到可以计算表达式的值而无需计算其他操作数为止。在上面的示例中,
anything
的值不会更改整个表达式的值。使用短路求值,根本不会计算
anything
的值,因为它不会影响整个表达式的值。由于
anything
方法调用需要相当长的时间来执行,短路求值可以避免调用它并节省执行时间

正如其他人在对问题的评论中已经提到的,将
|
实现为某个类的方法是不可能的。它的第二个操作数的值必须求值才能作为参数传递给该方法,这会中断短路行为

编程语言中逻辑值的通常表示形式只使用一位(我猜Ruby也是这样做的。)
|
|
的结果对于存储在一位上的操作数是相同的

Ruby使用
|
符号实现不同风格的
操作,如下所示:

  • 对于整数
  • 布尔型和
    nil型无短路
    
  • 对于数组
表达方式如下:

x = false | a | b | c
确保计算所有
a
b
c
表达式(无短路),并且
x
的值是
a
b
c
的逻辑值的逻辑OR

如果
a
b
c
是方法调用,则要使用逻辑OR运算符(
|
)获得相同的结果,代码需要如下所示:

aa = a
bb = b
cc = c
x = aa || bb || cc
这样,无论之前调用的方法返回什么值,都会调用每个方法

对于和,
|
运算符在不需要短路评估时非常有用


另外,对于(数组只是一个有序集),
操作符实现union,这是一种语义上等同于逻辑OR for set的操作。

如果您的
短路或
被作为值传递给
其他
,它是否已经被计算过?这不是短路。@Ry-它会像
a.short\u circuit\u或(b)
一样使用。如果
a
的值非零,那么它将立即返回
true
,并跳过
b
上的任何检查。哦,我想我明白你的意思了。。。真正的短路运算符可以与表达式一起使用。。。。然而这不能t@Jonah使用
true | |一个非常昂贵的操作
您将得到
true
。使用
true.short\u circuit\u或(一个非常昂贵的操作)
您仍然需要进行求值,以便将其传递给
short\u circuit\u或
调用。@ndn,是的,我现在明白了。这就是我所说的表达式,但你是对的,它可以应用于任何昂贵的操作,而不仅仅是昂贵的表达式。虽然从技术上讲,甚至方法调用都是一个表达式……但我重新表述了示例代码的解释,并纠正了(我希望)其他错误。现在好多了:)