ruby instance_variable_get возвращает ноль - PullRequest
4 голосов
/ 02 ноября 2010

У меня проблема с методом instance_variable_get, потому что он всегда возвращает nil-объект с одним из моих экземпляров объекта.Вот мой код:

logger.info "ASDF: " + @d_tree.inspect
logger.info "ASDF: " + @d_tree.instance_variable_get(:@content);

и вывод:

ASDF: #<DTree id: 11, parent_id: nil, content: "bababababa", subsidiary_info: "", deep_info: "blabla", title: "hello", direction: 1, created_at: "2010-10-26 19:27:32", updated_at: "2010-11-01 23:14:31", color: 2, cell_color: 2, howtoinfo: "howtoinfooo", textinfo: "textInfooo", locationinfo: "locationInfoooo", productinfo: "productinfoooo">
TypeError (can't convert nil into String):
    /app/controllers/d_trees_controller.rb:38:in `+'

В соответствии с осмотром, объект выглядит нормально, но instance_variable_get возвращает нулевой объект

Спасибо за вашу помощь!

Ответы [ 3 ]

3 голосов
/ 11 июня 2013

instance_variable_get (Arg)

Он должен возвращать значение переменной экземпляра или nil , если переменная экземпляра не установлена.

например

мы определяем следующий класс

  class Velpradeep
    def initialize(mark1, mark2)
      @m, @s = mark1, mark2
    end
end

При создании объекта класса

obj = Velpradeep.new(98,96)

Затем мы можем получить доступ к переменным экземпляра, используя:

irb(main):046:0> obj.instance_variable_get(:@m)
=> 98

Доступ к неопределенным переменным экземпляра, определенным в методе инициализации

irb(main):047:0> obj.instance_variable_get(:@p)
=> nil # provides nil bcz the instance variable is not defined 

Если вы хотите получить доступ к переменной, прежде чем вам нужно установить переменную экземпляра, используя

instance_variable_set ()

пример:

irb(main):048:0> obj.instance_variable_set(:@p, 99)
=> 99

Тогда мы можем использовать, он вернет значение переменной экземпляра ....

irb(main):049:0> obj.instance_variable_get(:@p)
=> 99
1 голос
/ 02 ноября 2010

Несмотря на то, что считаться плохой формой для непосредственного получения таких переменных экземпляра считается плохим, поскольку использование attr_accessor является предпочтительным методом, проблема в данном конкретном случае заключается в том, что нет переменной экземпляра с именем @content.То, что у вас есть, похоже, является атрибутом ActiveRecord.

Они выбираются с использованием другого механизма:

@d_tree.attributes[:content]

Обычно это даже немного избыточно, поскольку это приведет к ненужному созданию копии атрибутов.хэш.Типичный способ доступа:

@d_tree.content

Эти значения фактически находятся в переменной экземпляра @attributes, управляемой ActiveRecord.

0 голосов
/ 02 ноября 2010

instance_variable_get возвращает nil, если переменная неинициализирована (или если она была установлена ​​на nil, конечно).

Итак, очевидно, @content еще не инициализирован.

Почему он не был инициализирован, сказать невозможно, поскольку вы еще не показали нам какой-либо реальный код.

Это выглядит подобно @d_tree может быть ActiveRecord объект, и в этом случае решение довольно простое: ActiveRecord объекты не сохраняют свое состояние в переменных экземпляра, они поддерживаются базой данных.

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