2013-03-10 58 views
1
class Test 
    attr_accessor :something 
end 

class Test 
    alias :old_something= :something= 
    def something=(a) 
    a += 2    # do something with the argument 
    old_something=(a) # then pass it on 
    end 
end 

我希望,如果我說走樣setter方法

t = Test.new 
t.something = 3 
puts t.something 

這將打印出5。但它打印nil。爲什麼這不起作用?

+0

由於現在的問題,它不打印出5,它不打印出零,但看起來像#<測試:0x9aa4340> – vgoff 2013-03-10 21:24:30

+0

我已經修復了這個例子。 – MxyL 2013-03-10 21:45:30

+0

太棒了,現在問題會在示例中顯示。現在我的答案和示例現在可以精確到下面。 – vgoff 2013-03-11 00:10:11

回答

2

形式

foo = bar 

分配給一個局部變量。你需要明確說明你想調用一個方法:

self.foo = bar 
+0

不知何故,我在答案中錯過了這個明顯的觀點。我會留下我的答案,因爲它可能會解決其他問題。 – 2013-03-10 21:06:09

+0

啊,是的,這是問題所在。我之前幾次遇到過這個問題,但又一次忘記了它。 – MxyL 2013-03-10 21:11:23

0

編輯:@Jörg的答案可能是真正的問題,但我下面的原始答案可能也有幫助。從我的舊回答中修正了一些誤導性的細節。

如果你刪除了def something=完全,你會得到一個something二傳手其中有old_something別名:

class Test 
    attr_accessor :something 
end 

class Test 
    alias :old_something= :something= 
end 


1.9.3p327 :001 > require "./test.rb" 
=> true 
1.9.3p327 :002 > t = Test.new 
=> #<Test:0x000000018eb740> 
1.9.3p327 :003 > t.something = "blah" 
=> "blah" 
1.9.3p327 :004 > t.something 
=> "blah" 
1.9.3p327 :005 > t.old_something = "moo" 
=> "moo" 
1.9.3p327 :006 > t.something 
=> "moo" 
+0

因爲我想在傳遞之前進行一些值檢查,所以我正在僞裝setter。我想我應該在問題中包括這個,以縮小可能的解決方案。 – MxyL 2013-03-10 21:12:59

0

原因是@something永遠不會分配給任何東西。

此代碼將做你正在嘗試做的:

class Test 
    attr_accessor :something 
end 

class Test 
    alias :old_something= :something= 
    def something=(a) 
    @something = a += 2 # do something with the argument 
    old_something=(a) # then pass it on 
    end 
end 

t = Test.new 
t.something=(3) 
puts t.something 

的差異assinging實例變量@something的值,然後讓你的代碼通過已傳遞的a變量來增加它in。