请注意,这是对我的问题的跟进。
我正在尝试解析以下 Tcl 代码:
foo bar {
biz buzz
}
在 Tcl 中,foo
是方法名,bar
是参数,其余的是要处理的“块” eval
。
现在这是我目前对此的实现:
def self.foo(name, &block)
puts "Foo --> #{name}"
if block
puts "block exists"
else
puts "block does not exist"
end
end
def self.method_missing(meth, *args, &block)
p meth
p block
meth.to_s &block
end
tcl = <<-TCL.gsub(/^\s+/, "").chop
foo bar {
biz buzz
}
TCL
instance_eval(tcl)
输出以下内容:
:bar
#<Proc:0x9e39c80@(eval):1>
Foo --> bar
block does not exist
在此示例中,当块被传递给foo
方法时,它不存在。然而method_missing
它确实存在(至少它似乎存在)。这里发生了什么?
请注意,我知道 ruby 括号的优先级并意识到这是有效的:
foo (bar) {
biz buzz
}
但是,我想省略括号。那么这在 ruby 中是否可行(没有词法分析)?