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,是的,我现在明白了。这就是我所说的表达式,但你是对的,它可以应用于任何昂贵的操作,而不仅仅是昂贵的表达式。虽然从技术上讲,甚至方法调用都是一个表达式……但我重新表述了示例代码的解释,并纠正了(我希望)其他错误。现在好多了:)