Разница TOPLEVEL_BINDING в IRB и скрипте - PullRequest
0 голосов
/ 26 сентября 2018

Если я добавлю следующий код:

a = 42    
p TOPLEVEL_BINDING.local_variable_defined?(:a)

в файл "rubyScratch.rb" и рубиную его, используя

ruby rubyScratch.rb

, я получу

true

Однако в IRB я получаю

2.3.1 :001 > a = 42
=> 42 
2.3.1 :002 > TOPLEVEL_BINDING.local_variable_defined?(:a)
=> false 

Почему есть эта разница?

1 Ответ

0 голосов
/ 27 сентября 2018

Это связано с тем, что команда irb (в любом случае в моей системе) запускает небольшой скрипт ruby, который выглядит следующим образом:

#!/usr/bin/env ruby
#
#   irb.rb - interactive ruby
#       $Release Version: 0.9.6 $
#       $Revision: 40560 $
#       by Keiju ISHITSUKA(keiju@ruby-lang.org)
#

require "irb"

IRB.start(__FILE__)

Итак, TOPLEVEL_BINDING - это сценарий, а не контекст IRB.

В поисках дополнительной информации я наткнулся на эту короткую статью , в которой говорится:

Это, как следует из названия, связывание вашего сценарияmain scope:

a = 42
p binding.local_variable_defined?(:a) # => true
p TOPLEVEL_BINDING.local_variable_defined?(:a) # => true

def example_method
  p binding.local_variable_defined?(:a) # => false
  p TOPLEVEL_BINDING.local_variable_defined?(:a) # => true
end

example_method

Подводя итог, можно сказать, что TOPLEVEL_BINDING - это binding для первого сценария в текущем контексте, который был запущен виртуальной машиной Ruby.При запуске IRB этот сценарий запускает сеанс IRB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...