我的第一個想法是有些事情是這樣的:如何在子類中的方法之前和之後運行代碼?
class AbstractBuilder
attr_reader :time_taken
def build_with_timer
started_at = Time.now
build
@time_taken = Time.now - started_at
end
def build
raise 'Implement this method in a subclass'
end
end
class MyBuilder < AbstractBuilder
def build
sleep(5)
end
end
builder = MyBuilder.new.build_with_timer
puts builder.time_taken
我懷疑有它提供了更好的靈活性,比如理想,我想稱之爲「打造」的MyBuilder的一個實例,而不是一個更好的辦法'build_with_timer'並始終記錄執行時間。
我確實考慮過使用alias_method從初始化或甚至使用模塊mixin代替類繼承,它會覆蓋在中間調用super的構建方法(不知道這是否可行)。在我放下兔子洞之前,我想我會看看是否有一個確定的練習。
爲了澄清我想在一個子類中定義一個已知名稱的方法,該子類在基類中定義的代碼被透明地包裝(之前和之後)。比起說ActiveRecord過濾器,我需要更少的靈活性/開銷。 – Kris 2010-07-08 09:33:46
https://github.com/PragTob/after_do – Kris 2014-05-04 00:01:43