为什么“foo”不是===到/ foo /当比赛成功时?

时间:2012-03-25 22:27:36

标签: ruby syntax case equality

Ruby syntax reference关于案例陈述:

  

比较由运营商===

完成

事实上,例如:

ruby -e 'puts (1..3) === 2'

打印true,但是:

ruby -e 'puts "foo" === /foo/'

打印false,还有:

ruby -e 'puts :foo === /foo/'

打印false,但所有这些示例都是case语句的成功条件。它是如何运作的?

1 个答案:

答案 0 :(得分:7)

===运算符不可交换,这意味着"foo" === /foo//foo/ === "foo"是两个非常不同的东西。 case语句使用后一种顺序。

事实上,您使用范围的第一个示例已经显示正在使用该订单。 2 === (1..3)不起作用,就像你的第二个和第三个例子没有。

选择顺序的原因也很明显,至少如果你熟悉Ruby和OO设计中的运算符一般是如何运作的。

===运算符是一种常规方法,因此编写/foo/ === "foo"的另一种方式是/foo/.===("foo") - 这个顺序是有意义的,因为正则表达式确实知道它是否与字符串匹配,但是字符串没有正则表达式的概念,也不知道它是否与一个匹配。扩展到第一个示例,范围确实知道元素是否是其中的一部分,但元素不知道它是否是范围的一部分。