为什么Ruby会在线上提出最后一个未定义变量的错误?

Sam*_*lor 11 ruby interpreter operator-precedence

假设foo,barbaz还没有被定义,则线

foo bar baz

引发此错误:

NameError (undefined local variable or method `baz' for main:Object)

在REPLs为Python,PHP和JavaScript的第一问题foo(bar(baz))foo没有定义.为什么Ruby baz首先抱怨?

mea*_*gar 5

Ruby 允许调用的第一个方法 ( baz) 动态定义其他两个方法。在实际方法调用发生之前,它不会尝试解析foobar作为方法调用,并且它永远不会到达该方法调用,因为baz首先会导致错误。

如果baz动态定义方法foobar,就没有问题:

def baz
  define_method(:foo) { |x| "foo #{x}" }
  define_method(:bar) { |x| "bar #{x}" }
  "baz!"
end

foo bar baz # => "foo bar baz!"
Run Code Online (Sandbox Code Playgroud)

  • @JordanRunning 语言的解析和评估方式存在差异,您必须询问对这两种语言有更深入了解的人,为什么 Ruby 选择允许这样做而 JavaScript 则不允许。 (2认同)