проблема класса ruby - PullRequest
0 голосов
/ 10 июля 2010

У меня есть следующий код рубина:

class Mp
  def initialize

    Test.new.mytest
    Work.new.mywork
    ha
    address

  end

  def ha
    puts "message from ha"
  end

  def address

   a='see'

  end

end


class Test

  def mytest
    m=Mp.new
    puts "Message from test do you #{m.address}"
  end
end

class Work

  def mywork
    puts "message from work"
  end

end

Mp.new

Это прекрасно работает, за исключением части в def mytest, где я пытаюсь выставить адрес m.address. Заранее спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 10 июля 2010

На самом деле причина, по которой это не работает, не имеет ничего общего с печатью адреса.Это одна строка до этого:

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
2 голосов
/ 10 июля 2010

У вас есть бесконечный цикл. Вы создаете новый объект класса Mp, который, в свою очередь, создает новый объект класса Test, а затем вызывает его метод mytest, который, в свою очередь, создает другой объект класса Mp, который, в свою очередь ...

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