NameError в конструкторе в ruby - PullRequest
       6

NameError в конструкторе в ruby

0 голосов
/ 30 декабря 2010

Я пытаюсь установить значение по умолчанию в переменной экземпляра. Я делаю:

module MyModule::MyOtherModule
  class MyClass
    attr_accessor :point

    def initialize
      @point = Point.new(0,1)
    end
  end
end

module MyModule
  class Point
    attr_accessor :x, :y

    def initialize(x, y)
      @x = x
      @y = y
    end
  end
end

Точка - это тоже класс, который я написал. Самое смешное, что когда я запускаю этот образец, я получаю:

uninitialized constant MyModule::MyOtherModule::MyClass::Point (NameError)

Но если я перенесу присвоение в другой метод вместо конструктора - скажем, foo - ошибка не произойдет. Я думаю, это говорит о том, что это не связано с расположением модуля. Итак, что не так?

Ответы [ 2 ]

2 голосов
/ 30 декабря 2010

Так как ваш класс Point находится в области действия MyModule, лучше всего обращаться к нему следующим образом: MyModule::Point. Небольшое изменение в вашем конструкторе MyClass будет:

def initialize
  @point = MyModule::Point.new(0,1)
end
2 голосов
/ 30 декабря 2010

Модуль =! модуль

Класс =! класс

В этом случае Module и Class являются константами в Ruby, поэтому по сути этот код неверен. Правильные конструкции модулей и классов исключены. Это первое.

Во-вторых, чтобы ответить на ваш вопрос, нам нужно посмотреть, как на самом деле выглядят определения класса Point, и как вы создаете экземпляр MyClass. В данный момент сообщение ясно: uninitialized constant, он не может найти точку где-либо в области видимости.

EDIT

module MyModule
  module MyOtherModule
    class MyClass
      attr_accessor :point

      def initialize
        #as mentioned by nas
        @point = MyModule::Point.new(0,1)
      end
    end
  end
end

module MyModule
  class Point
    attr_accessor :x, :y

    def initialize(x, y)
      @x = x
      @y = y
    end
  end
end

obj = MyModule::MyOtherModule::MyClass.new()
puts obj.point.x #=> 0
puts obj.point.y #=> 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...