2017-01-07 56 views
3

全部 Ruby中的平等是“严格的”,类似于PHP中的===?我注意到Ruby中有一个===运算符,但它做了一些不同的事情。Ruby为什么没有!==运算符?

+0

快速谷歌搜索来确定它是一个从句的时候,所以如果我有一个最好的猜测它会是,他们只是没有添加'!=='。 – Rogue

+0

对于那些不熟悉PHP的人,请解释一下'!=='操作符会返回什么,以及“strict”是什么意思,最好是编辑问题。这是否与对象相同而值相同? –

回答

1

啊......深入挖掘后,我想我回答了我自己的问题。红宝石有.eql?.equal?link

1

使用== 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 === bb === a不一样。

+0

为什么'==='不应该被使用,除非你确切地知道你在做什么,这有很多原因。 – tadman

3

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语句比较事物的默认方法。

+0

@akuhn在那里写了一些改写。 – tadman

8

===不是平等运算符!

不是。

如在,它不是。

让我们真正把握这一点。

您可能熟悉===作为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 whengrep间接使用,因此可能似乎并不需要一个明确的逆操作。生产代码的大多数样式指南无论如何都禁止使用===操作员。

如果您正在寻找其他运营商的平等,检查.eql?.equal?

相关问题