我写了一个自定义的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)
为什么我原来的比赛不起作用?
我的版本:
答案 0 :(得分:1)
有时,我们将nil
的匹配器更改为nil?
。不幸的是,您无法再从ruby-parse
或node.to_s
复制粘贴输出,而立即拥有一个有效的匹配器。
只需添加其他问号,即可使您的模式再次起作用:
def_node_matcher :is_foo_bar?, <<-PATTERN
(send (const nil? :Foo) :bar)
PATTERN