为什么Ruby使用=~而不是~=作为匹配运算符?

3
我有一个关于Ruby匹配运算符的愚蠢问题。为什么Ruby使用匹配运算符=~而不是~=?是出于历史、心理或其他考虑而选择前者而非后者吗?
我找不到任何相关信息,但我需要搞清楚这一点,因为其他运算符(如+=-=!=>=<=)将=置于其他运算符右侧,而=~则相反。
请给我指点迷津。

7
我猜这是为了保持与Perl中相同的运算符。 - Lucas Trzesniewski
1
Perl从一开始就使用=〜!〜,即1987年。 - Stefan
1
据我所知,“~”用于模式匹配,它来自AWK,这也是Perl得到灵感的地方。 - mu is too short
也许编程语言的开发者应该添加一些别名,以方便那些无法保持正确顺序的人。这只能在其他方式未被使用和不能使用时才会实现,例如 ~=, =<, '=!' 等等。 :-) - Cary Swoveland
2个回答

5

我的观点是它更加一致。有几个 '等于' 和 '匹配' 运算符。例如:

=~ 表示 '匹配'

!~ 表示 '不匹配'

== 表示 '等于'

!= 表示 '不等于'


我最近一直在学习Bash,而Bash使用=〜,所以为了保持一致性,我同意这种用法。 - ddavison

3

从更高的层面来看,如果你考虑以文字方式读取这些符号,它们的意义就变得非常清晰:

  • += -= 基本上是在表达 a = a + b 或者 a = a - b,显然在赋值(=) 之前必须进行加法(+) 或减法(-)。
  • 至于像 >= != 这样的比较运算符也很有道理,因为你想要问的是 a 是否大于(>) 或等于(=) b,或者说 a 不(!) 等于(=) b,那么为什么不这样写呢。
  • 同样,~= 就像在询问 a 的匹配(~) 是否(=) 能够与 b 匹配,当你想要的是 =~,表示想要知道 a 是否(=) 与模式(~) b 匹配。

如果你把它们看作文字,它们就变得非常简洁。


1
如果我们写(pattern) =~ (string)呢? - Cary Swoveland
@CarySwoveland 对于 Regexp 类来说,我同意另一个答案,因为它更符合一致性,但是如果你查看 C 源代码,所有 String#=~ 做的就是转置参数并调用与 Regexp#=~ 相同的方法(rb_reg_match)。虽然 Regexp 处理模式中变量的赋值,而 String 则不处理。 - engineersmnky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接