Как я могу получить доступ к переменной, определенной в файле Ruby, который мне нужен в IRB?

Файл welcome.rb содержит:

welcome_message = "hi there"

Но в IRB я не могу получить доступ к только что созданной переменной:

require './welcome.rb'

puts welcome_message 

# => undefined local variable or method `welcome_message' for main:Object

Каков наилучший способ принести предопределенные переменные и выполнить работу по инициализации, когда вы require что-то в вашем сеансе IRB? Глобальные переменные не выглядят как правильный путь.

Ответы

Ответ 1

Хотя верно, что вы не можете получить доступ к локальным переменным, определенным в необходимых файлах, вы можете получить доступ к константам, и вы можете получить доступ к чему-либо, хранящемуся в объекте, к которому у вас есть доступ в обоих контекстах. Таким образом, есть несколько способов обмена информацией, в зависимости от ваших целей.

Наиболее распространенным решением, вероятно, является определение модуля и добавление его общего значения. Поскольку модули являются константами, вы сможете получить к нему доступ в требуемом контексте.

# in welcome.rb
module Messages
  WELCOME = "hi there"
end

# in irb
puts Messages::WELCOME   # prints out "hi there"

Вы также можете поместить значение внутри класса, чтобы тот же эффект. Кроме того, вы можете просто определить его как константу в файле. Поскольку контекст по умолчанию является объектом класса Object, который называется основным, вы также можете определить метод, переменную экземпляра или переменную класса на главной. Все эти подходы в конечном итоге являются существенно разными способами создания "глобальных переменных" более или менее и могут быть не оптимальными для большинства целей. С другой стороны, для небольших проектов с очень четко определенными областями они могут быть в порядке.

# in welcome.rb
WELCOME = "hi constant"
@welcome = "hi instance var"
@@welcome = "hi class var"
def welcome
  "hi method"
end


# in irb
# These all print out what you would expect.
puts WELCOME
puts @welcome
puts @@welcome
puts welcome

Ответ 2

Вы не можете получить доступ к локальным переменным, указанным во включенном файле. Вы можете использовать ivars:

# in welcome.rb
@welcome_message = 'hi there!'

# and then, in irb:
require 'welcome'
puts @welcome_message
#=>hi there!

Ответ 3

Я думаю, что лучший способ - определить класс, подобный этому

class Welcome
  MESSAGE = "hi there"
end

то в irb вы можете вызвать свой код следующим образом:

puts Welcome::MESSAGE

Ответ 4

Это должно хотя бы включить опыт irb:

def welcome_message; "hi there" end