Это небольшая ошибка, которую мы надеемся получить в будущем лучше.
Итак, первая часть этой головоломки - понять, что var
- это локальная переменная, потому что она начинается со строчной буквы, а Addr
- это постоянная, потому что она начинается с заглавной буквы.
По причинам инициализаторы констант, поэтому код после знака =
в константном присваивании выполняется лениво при первом обращении к константе. Из-за этого они существуют в своей собственной области и не могут ссылаться на локальную переменную, определенную в области верхнего уровня.
Так что для вашего примера есть три выхода из этого. Сначала сделайте Addr
локальной переменной тоже, вызвав ее addr
. Второе повышение var
до константы, вызывая ее Var
. Или, в-третьих, поместите весь код в инициализатор констант:
Addr = begin
ip = ARGV.find { |arg| arg.count('.') == 3 } || "0.0.0.0"
ARGV.delete(ip)
ip.split('.').map { |part| part.to_i { 0 } }.join('.')
end
Какой из трех вариантов лучше всего зависит в основном от вкуса и структуры вашей программы.