На самом деле причина, по которой это не работает, не имеет ничего общего с печатью адреса.Это одна строка до этого:
m = Mp.new
, это создает новый Mp
объект.Однако внутри метода инициализации Mp
создается новый объект Test
и вызывается его метод mytest
.Затем метод mytest
снова создает новый объект Mp и так далее.Другими словами: Test#mytest
и Mp#initialize
являются взаимно и бесконечно рекурсивными.
Отредактируйте в ответ на ваш комментарий:
Я не совсем уверен, что понял вопрос.Если вы имеете в виду «Как получить доступ к переменной a
, которая была установлена в методе address
, после вызова address
», то вы этого не сделаете.a
- это локальная переменная, которая выходит из области действия после возврата метода.Если вы хотите установить переменную экземпляра, используйте @a = 'see'
.@
обозначает переменные экземпляра в ruby.Если вы хотите иметь доступ к этой переменной извне объекта, используйте attr_accessor :a
, чтобы определить методы доступа для @a
.
Пример:
class Mp
attr_accessor :c
def initialize
initialize_variables
puts @c
puts @b # I can access @c and @b here because it's an instance variable
# and I'm within the same object
# puts a # This does not work because a is a local variable from the
# initialize_variables method and no longer in scope
end
def initialize_variables
a = "a"
@b = "b"
@c = "c"
puts a # I can access a here because I'm still inside the method
# where a was defined
end
end
m = Mp.new
# puts m.a
# puts m.b # These don't work because there are no methods a or b
puts m.c # This works because attr_accessor defined a method c which
# returns the content of m's @c variable