【发布时间】:2016-04-15 15:02:12
【问题描述】:
String#match 和 Regexp#match 在匹配成功时返回 MatchData:
"".match(//) # => #<MatchData "">
//.match("") # => #<MatchData "">
//.match(:"") # => #<MatchData "">
但Symbol#match返回匹配位置(如String#=~):
:"".match(//) # => 0
为什么Symbol#match 的行为不同?有用例吗?
【问题讨论】:
-
确实很奇怪的决定......
-
在我看来,重点又是性能。
Symbol#match应该提供最佳性能,因为效率是使用 Symbol 的通常好处。如果该方法要创建一个字符串,它将涉及更多的内部操作(在堆中创建对象、分配新的 id 等)。由于符号是不可变的,因此字符串表示副本是必要的。因此,仅返回第一个匹配项的索引是一种更有效的方式来判断匹配项是否成功,如果成功,在哪里。 -
@stribizhev 虽然我们还有
Symbol#=~,但这种解释对我来说并不合理。 -
这似乎是一个错误。看看this commit。
Symbol#=~和Symbol#match相当于之前的String方法(在 1.9 开发期间,Symbol曾是String的子代)。但是提交将both(!) 的底层C 函数更改为sym_match()(这是=~的实现并返回一个整数)。