2013-06-29 68 views
2

我想爲對象定義新的getter方法。下面是我在irb正在寫代碼:無法在Ruby中的本徵類中定義getter方法

> eigenclass = class << self; self; end 
> eigenclass.class_eval { attr_reader :foo } 

我想,這個代碼應添加foo方法自我對象。但接下來的線條說不同

puts foo 
=> nil 
foo = 1 
=> 1  #Why is there no exception? 
puts foo 
=> 1 
puts @foo 
=> nil 

這是爲什麼?

+0

你不需要自定義'eigenclass'。已經有'singleton_class'了。 – sawa

回答

3

這是因爲var = val分配一個局部變量比調用setter方法。

你需要爲了調用(你有相同名稱的局部變量的情況下,實際的getter)的setter,它拋出你所期望的誤差self.前綴是:

2.0.0p195 :001 > eigenclass = class << self; self; end 
=> #<Class:#<Object:0x007fc6f98e24d0>> 
2.0.0p195 :002 > eigenclass.class_eval { attr_reader :foo } 
=> nil 
2.0.0p195 :003 > foo 
=> nil 
2.0.0p195 :004 > foo = 20 
=> 20 
2.0.0p195 :005 > foo 
=> 20 
2.0.0p195 :006 > self.foo 
=> nil 
2.0.0p195 :007 > self.foo = 20 
NoMethodError: undefined method `foo=' for main:Object 
    from (irb):7 
3

你犯了兩個錯誤: a)如果你想完全存取(getter和setter),你應該使用:

eigenclass.class_eval { attr_accessor :foo } 

b)如果您想使用的setter方法,你應該使用self關鍵字,否則將Ruby設置局部變量:

self.foo = 1 
# => 1 
puts @foo 
# => 1 

或者沒有定義setter方法,你可以直接設置實例變量:

eigenclass.class_eval { attr_accessor :foo } 
@foo = 1 
puts @foo 
# => 1