是全部 Ruby中的平等是“严格的”,类似于PHP中的===
?我注意到Ruby中有一个===
运算符,但它做了一些不同的事情。Ruby为什么没有!==运算符?
回答
啊......深入挖掘后,我想我回答了我自己的问题。红宝石有.eql?
.equal?
link
使用==
Ruby的平等性并不严格,至少不是像JavaScript中的===
那样。 Ruby具有更严格的平等方法,例如eql?
和equal?
,但===
并非严格相等。 ===
方法被称为包含运算符。它最常用于case
语句中。这是说,
case a
when b ...
when c ...
else ...
end
相当于
if b === a
...
elsif c === a
...
else
...
end
话虽如此,!==
可能存在,而是它只是留给用户做!(a === b)
。请注意,===
不可交换,因为a === b
与b === a
不一样。
为什么'==='不应该被使用,除非你确切地知道你在做什么,这有很多原因。 – tadman
Ruby不需要严格的===
类型的运算符,因为默认的比较器==
已经非常严格了,不像PHP和其他。这不是经常任何形式的转换完成的情况下,所以在那里进行的情况下脱颖而出,成为卓越:
0 == ""
# => false
0 == "0"
# => false
"" == " "
# => false
0 == nil
# => false
0 == 0.0
# => true
事实上,当你做使用===
你经常通过过于找麻烦具体或邀请意外的行为:
"" === String
# => false
String === ""
# => true
String === Object
# => false
Object === String
# => false
的===
含义是由不同阶级不同的方式界定为经常的事情无关“平等”。这只是一个简短的例子,如<<
有时。 Object === String
实际上是Object.===(String)
,这就是它从String.===(Object)
产生不同结果的原因。在这种情况下,它意味着“等于......或派生类......”。
这是因为这个相对罕见的地方,!==
并不需要首先存在。 ===
通常只能间接使用,因为它是通过case
语句比较事物的默认方法。
@akuhn在那里写了一些改写。 – tadman
===
不是平等运算符!
不是。
如在,它不是。
让我们真正把握这一点。
您可能熟悉===
作为Javascript和PHP中的相等运算符,但这不仅仅是Ruby中的等同运算符,而且与其他语言具有根本不同的语义。
那么===
是做什么的?
===
是模式匹配运算符!
===
匹配的正则表达式===
检查范围会员===
检查是一类===
调用Lambda表达式===
有时检查平等的实例,但大多不
所以这种疯狂是如何理解的?
Enumerable#grep
使用===
内部case when
语句中使用===
内部
这就是为什么你可以在case when
语句中使用正则表达式和类别和范围,甚至lambda表达式。
一些例子
case value
when /regexp/
# value matches this regexp
when 4..10
# value is in range
when MyClass
# value is an instance of class
when ->(value) { ... }
# lambda expression returns true
when a, b, c
# value matches one of a, b, c with `===`
when *array
# value matches an element in array with `===`
when x
# values is equal to x unless x is one of the above
end
所有与pattern === value
这些示例工作过,以及与grep
方法。
我只能猜测为什么没有!==
方法,但Tadman的直觉似乎发现上,===
主要是通过case when
和grep
间接使用,因此可能似乎并不需要一个明确的逆操作。生产代码的大多数样式指南无论如何都禁止使用===
操作员。
如果您正在寻找其他运营商的平等,检查.eql?
和.equal?
- 1. 为什么没有“< - ”运算符?
- 2. 在Ruby(1.9.3)中,为什么nil没有响应比较运算符'<=>`?
- 3. 运算符|| =在Ruby中代表什么?
- 4. Ruby中的“=〜”运算符是什么?
- 5. 为什么OpenCV没有为cv类重载运算符*/+ Mat
- 6. 为什么微软没有为stringbuilder重载+ =运算符?
- 7. 为什么在C/C++中没有|| =运算符?
- 8. 为什么Ada中没有(增强赋值)运算符,如+ =, - =或++?
- 9. 为什么C没有逻辑赋值运算符?
- 10. 为什么C#中没有|| =或者&& =运算符?
- 11. 为什么在SceneKit中没有运算符重载?
- 12. PHP,为什么没有人使用?:运算符?
- 13. 为什么Ruby使用=〜而不是〜=来匹配运算符?
- 14. 在Ruby中,“和”,“或”运算符有什么智慧吗?
- 15. Ruby中的一元加运算符有什么意义?
- 16. 为什么`:=`作为中缀运算符?
- 17. Ruby中<=>运算符的名称是什么?他们称之为什么?
- 18. SQL中的IN运算符和=运算符有什么区别?
- 19. 比较运算符和逻辑运算符有什么区别?
- 20. 为什么C#中的8位和16位整数没有算术运算符(+, - ,*,/,%)?
- 21. 为什么对于短基元,有赋值运算符(&=,+ =)但没有非赋值运算符(&,+)?
- 22. CUDA:为什么按位运算符有时比逻辑运算符更快?
- 23. ruby中的类名之前的符号/运算符是什么?
- 24. Ruby =〜vs ===运算符
- 25. 为什么重载运算符&&错误?
- 26. 按位运算符:为什么〜35 = -36?
- 27. 为什么“==”运算符不起作用
- 28. 为什么Javascript运算符“&&”很奇怪?
- 29. 为什么不QString超载+运算符?
- 30. 运算符+ =重载,为什么是const?
快速谷歌搜索来确定它是一个从句的时候,所以如果我有一个最好的猜测它会是,他们只是没有添加'!=='。 – Rogue
对于那些不熟悉PHP的人,请解释一下'!=='操作符会返回什么,以及“strict”是什么意思,最好是编辑问题。这是否与对象相同而值相同? –