ruby instance_variable_get返回nil

时间:2010-11-02 13:51:19

标签: ruby-on-rails ruby

我遇到了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返回一个nil对象

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

<强> 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

访问initialize方法中定义的未定义实例变量

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 :(得分:1)

虽然直接获取这样的实例变量被认为是不好的形式,因为使用attr_accessor是首选方法,这个特定实例中的问题是没有名为@content的实例变量。您所拥有的似乎是ActiveRecord属性。

使用不同的机制获取这些内容:

@d_tree.attributes[:content]

通常这甚至有点多余,因为这将不必要地创建属性哈希的副本。访问的典型方式是:

@d_tree.content

这些值实际上位于ActiveRecord管理的@attributes实例变量中。

答案 2 :(得分:0)

如果变量未初始化(或者当它已设置为instance_variable_get,则

nil会返回nil

所以,显然,@content尚未初始化。

为什么尚未初始化是不可能的,因为你还没有向我们展示任何实际的代码。

看起来就像@d_tree可能是ActiveRecord对象一样,在这种情况下解决方案相当简单:ActiveRecord个对象不保持其状态实例变量,它们由数据库支持。