Почему Ruby вызывает ошибку для последней неопределенной переменной в строке? - PullRequest
0 голосов
/ 08 июня 2018

Предполагая, что foo, bar и baz не были определены, строка

foo bar baz

вызывает эту ошибку:

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

В REPL для Python, PHP и Javascript первая проблема в foo(bar(baz)) заключается в том, что foo не определено.Почему Руби жалуется на baz сначала?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Ruby позволяет первому вызванному методу (baz) динамически определять два других метода.Он не пытается разрешить foo или bar как вызовы метода, пока не произойдет фактический вызов метода, и никогда не достигает этого вызова метода, поскольку baz сначала вызывает ошибку.

Если bazдинамически определяет методы foo и bar, проблем нет:

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

foo bar baz # => "foo bar baz!"
0 голосов
/ 08 июня 2018

Ссылка на этот пост ruby-magic-code-interpretation

и проверьте его в консоли

2.3.1 :001 > puts RubyVM::InstructionSequence.compile("foo bar baz").disasm
== disasm: #<ISeq:<compiled>@<compiled>>================================
0000 trace            1                                               (   1)
0002 putself          
0003 putself          
0004 putself          
0005 opt_send_without_block <callinfo!mid:baz, argc:0, FCALL|VCALL|ARGS_SIMPLE>, <callcache>
0008 opt_send_without_block <callinfo!mid:bar, argc:1, FCALL|ARGS_SIMPLE>, <callcache>
0011 opt_send_without_block <callinfo!mid:foo, argc:1, FCALL|ARGS_SIMPLE>, <callcache>
0014 leave            
 => nil 

По порядку интерпретатора ruby ​​он выдает ошибку

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