【问题标题】:Why does `Symbol#match` behave differently from `String#match` and `Regexp#match`?为什么 `Symbol#match` 的行为与 `String#match` 和 `Regexp#match` 不同?
【发布时间】:2016-04-15 15:02:12
【问题描述】:

String#matchRegexp#match 在匹配成功时返回 MatchData

"".match(//) # => #<MatchData "">
//.match("") # => #<MatchData "">
//.match(:"") # => #<MatchData "">

Symbol#match返回匹配位置(如String#=~):

:"".match(//) # => 0

为什么Symbol#match 的行为不同?有用例吗?

【问题讨论】:

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

标签: ruby regex symbols


【解决方案1】:

我将它报告为 Ruby 核心中的一个错误:https://bugs.ruby-lang.org/issues/11991。让我们看看他们会怎么说。


更新 受到质疑的行为似乎是一个错误。似乎从 Ruby 2.4 开始,Symbol#match 将在匹配成功时返回一个 MatchData 实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多