8

在阅读了对另一个问题的答案的评论并进行了一些研究后,我发现它=~是定义的Object,然后被Stringand覆盖RegexpStringRegexp似乎假设另一个类的实现:

"123" =~ "123" # => TypeError: type mismatch: String given
/123/ =~ /123/ # => TypeError: can't convert Regexp to String

虽然=~是为 定义的Object+但不是:

Object.new =~ 1 # => nil
Object.new + 1 # => undefined method `+' for #<Object:0x556d38>

为什么Object#=~已经定义,而不是限制=~StringRegexp

4

3 回答 3

2

好吧,我想这实际上在 String=~ 文档中得到了很好的回答:

Match - 如果 obj 是 a Regexp,则将其用作匹配 str 的模式,并返回匹配开始的位置,或者nil如果没有匹配。

否则,调用,作为参数obj.=~传递。 Object 中str的默认值返回.=~nil

关键是,您可以编写自己的 Object 实现=~- 它将在String =~ Not Regexp语句中使用。

于 2012-12-22T13:43:14.913 回答
2

因为它允许在匹配表达式中使用任何对象:

Object.new =~ /abc/
=> nil

Object.new我想这在与正则表达式不匹配的方式上是有道理的,/abc/如果左参数不是String对象,代码会爆炸。所以它通常会简化代码,因为您可以在运算符的左侧拥有任何对象=~

于 2012-12-22T13:45:36.297 回答
2

从您的评论中,您的实际问题是为什么=~定义为Objectwhile+不是。

原因是Object#=~可以返回nil随机对象(因为它们不匹配),但Object#+不能返回有意义的结果。

它不一定超级有用,但不能说它是错误的(你必须展示一个匹配来证明nil结果是矛盾的)。见空虚真理的数学概念。另一方面,任何结果Object.new + 1都可能导致矛盾。

这类似于<=>that can return nil(因此也定义在Object) while <, >, ..., can not return trueor falsewhile is fully compatible。请注意,在这些情况下Class#>决定返回。nil

于 2012-12-22T22:25:58.360 回答