2014-05-15 57 views
0

如何從我的類實例中獲取數據?我可以得到這個:無法從ruby中的類實例獲取對象數據

instance = MyModule::MyClass.new(obj1, obj2) 

puts instance 
#=> #<MyModule::MyClass:0x0000010120de68> 

puts instance.inspect 
#=> #<MyModule::MyClass:0x000001019157b0 @obj1=#<MyModule::MyOtherClass:0x00000101915b20 @obj=["stuff", "more stuff", "things"]>, @obj2=#<MyModule::MyThirdClass:0x00000101915a80 @obj=["more things", "even more"]>> 

我以爲我可以只是做instance.obj1並從這裏得到@obj數組。這給了我「未定義的方法」。這裏有什麼問題?

回答

2

無法在默認情況下從外部訪問的實例變量:

class Foo 
    def initialize(obj) 
    @obj = obj 
    end 
end 

foo = Foo.new(123) #<Foo:0x007fdc312205f0 @obj=123> 
foo.obj   # undefined method `obj' ... (NoMethodError) 

你必須創建一個getter這樣做,例如通過attr_reader

class Foo 
    attr_reader :obj 

    def initialize(obj) 
    @obj = obj 
    end 
end 

foo = Foo.new(123) 
foo.obj   #=> 123 
+0

但我確實有訪問者! – cheeseandpepper

+0

請發表相關的代碼 – Stefan

+0

我想通了。涉及3個班級。將另外兩個類作爲參數的類有attr_accessors,但其他具有我想要公開的變量的類沒有任何getter/setter。 – cheeseandpepper

0

你必須發佈你的類定義給我們,以確定問題是什麼,但我猜你沒有爲你的對象定義屬性getters/setters。由於Ruby變量範圍的工作方式,實例變量被本地化爲對象實例的內部範圍(這意味着它們只能在類定義中的方法定義中訪問)。

爲了從類定義的範圍之外訪問這些變量,必須定義屬性getter和setter,與是暴露這些變量的外部範圍的方法:

class Foo 
    def initialize(name) 
    @name = name 
    end 

    # attribute getter for @name 
    def name 
    @name 
    end 

    # attribute setter for @name 
    def name=(n) 
    @name = n 
    end 
end 

這是這樣一個共同的圖案Ruby已經爲定義實例變量的設置者和獲取者提供了輔助方法:attr_readerattr_writerattr_accessor

  • attr_reader採用一個或多個符號作爲參數(其對應於要定位的實例變量),並創建吸氣方法爲每個。
  • attr_writer需要的符號相同的列表爲attr_reader而造成二傳手方法作爲參數傳遞的每個實例變量名
  • attr_accessor同時生成二傳手的getter方法命名實例變量。
class Bar 
    attr_reader :name # only allow reading of @name 
    attr_accessor :rank, :age # enable both reading and writing of @rank and @age 

    def initialize(name, rank, age) 
    @name = name 
    @rank = rank 
    @age = age 
    end 
end 

b = Bar.new('Jack BeLucky', 'Corporal', 32) 
b.name 
=> 'Jack BeLucky' 
b.age 
=> 32 
b.age += 1 
b.age 
=> 33