我遇到了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对象
感谢您的帮助!
答案 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
个对象不保持其状态实例变量,它们由数据库支持。