为什么此发送模式不匹配?

时间:2019-12-18 16:52:16

标签: rubocop ruby-parser

我写了一个自定义的rubocop警察,摘录如下:

def_node_matcher :is_foo_bar?, <<-PATTERN
  (send (const nil :Foo) :bar)
PATTERN

def on_send(node)
  puts "Match" if is_foo_bar?(node)
end

我正在尝试以下代码:

Foo.bar

有趣的是,node.to_s说的很符合我的模式:

"(send
  (const nil :Foo) :bar)"

但是该节点不匹配。如果我将模式更改为以下模式,则可以运行:

(send (...) :bar)

为什么我原来的比赛不起作用?

我的版本:

  • 红宝石2.6.2
  • ast 2.4.0
  • rubocop 0.77.0
  • 解析器2.6.4.1

1 个答案:

答案 0 :(得分:1)

有时,我们将nil的匹配器更改为nil?。不幸的是,您无法再从ruby-parsenode.to_s复制粘贴输出,而立即拥有一个有效的匹配器。

只需添加其他问号,即可使您的模式再次起作用:

def_node_matcher :is_foo_bar?, <<-PATTERN
  (send (const nil? :Foo) :bar)
PATTERN
相关问题