2012-04-03 71 views
2

我正在尋找做一些方法鏈接。我有以下代碼:檢測鏈接的方法

class MyClass 

    attr_accessor :handler 

    def do_a 
    puts 'i just did a' 
    self.handler = 'a' 
    self 
    end 

    def do_b_if_a 
    puts 'i just did b' if handler == 'a' 
    end 

end 

所以下面的工作:

irb > test = MyClass.new 
=> #<MyClass:0x007fa44ced9a70 @handler=nil> 
irb > test.do_a 
'i just did a' 
irb > test.do_a.do_b_if_a 
'i just did a' 
'i just did b' 

我不什麼想工作的時候我打電話do_a它第一次設置了處理,這意味着現在do_b_if_a可隨時致電。但我只希望在與do_a鏈接時調用它,我該怎麼做?

回答

0

我覺得你在跟蹤狀態錯誤的地方。你會用類似的ActiveRecord的查詢界面,更好的東西了,例如:

class MyClass 
    attr_accessor :handler 

    def do_a 
    puts 'i just did a' 
    with_handler 'a' 
    end 

    def do_b_if_a 
    puts 'i just did b' if handler == 'a' 
    end 

private 

    def with_handler(h) 
    o = dup 
    o.handler = h 
    o 
    end 

end 

這樣,你總是有MyClass的實例,但你有一個扔掉的副本跟蹤它的歷史。這與cHao's方法類似,但它不需要額外的裝飾器類,因爲MyClass可以裝飾自己。

1

如果您的方法是以某種方式調用的,一般情況下,您不需要關心(在大多數情況下,您甚至不知道知道)。那種方式就是瘋狂。神奇的通話序列讓人無時無刻地進行調試和測試。

你可以做什麼,雖然...而不是有do_a返回self,圍繞它包裝一個裝飾器,定義do_b,並返回裝飾器。在這一點上,你的原始MyClass不能do_b,因爲它不知道如何。但從do_a返回的東西可以。

(現在,你仍然可以說像a = test.do_a然後a.do_b,但你不能真正得到解決,如果沒有解析Ruby代碼自己。)

0

由於超說,你不應該試圖方法調用圖案。但我也能想到另一種方式來做到這一點:

def do_a 
    puts "i just did a" 
    do_b_if_a(true) 
end 

def do_b_if_a(did_a=false) 
    puts "i just did b" if did_a 
end 

do_a  # prints "i just did a" 
do_b_if_a # does nothing 

當然,你可以電話do_b_if_a(true),但隨後只是使它更加靈活;)

+0

問題是我仍然需要訪問該對象。 – 2012-04-03 22:41:43

+0

你是什麼意思,訪問該對象? – Jwosty 2012-04-03 22:42:47

0

沒有得到你一路有,但你可以定義do_b_if_a爲被添加時to_a被稱爲單方法:

class MyClass 

    def do_a 
    puts 'i just did a' 
    self.tap{|s| def s.do_b_if_a; puts 'i just did b' end} 
    end 

end 

如果你想利用你可以在Kernel.caller看看基於調用堆棧的某些操作。但是,如果你沒有足夠的理由這樣做,你可能會被另一位開發人員嘲笑,哈哈。