2010-06-04 14 views
1

我有一個類Autodrop,它包含幾個方法,a.o. '元數據',它調用一個外部API(Dropbox)。他們很慢。 但是,當初始化AutodropImage時,我已經經常擁有這些元數據,所以我應該讓這些方法更加智能。替代初始化一個類,以避免處理已知信息

我心目中是這樣的:

class Autodrop 
    include Dropbox 
    attr_reader :path 

    def initialize(path) 
    @path = path 
    end 

    def self.from_entry(drop_entry) 
    @drop_entry = drop_entry 
    self.initialize(@drop_entry.path) 
    end 

    def metadata 
    if @drop_entry = nil 
     return heavy_lifting_and_network_traffic 
    else 
     return @drop_entry.metadata 
    end 
    end 
    #... 
end 

現在,我希望打電話

entry = BarEntry.new() 
foo = Autodrop.from_entry(entry) 
foo.metadata 

爲了避免提重物和網絡流量的呼叫。

但這不起作用。不管怎樣,在我的新手中,我肯定我對這一切都是錯誤的。 是否有一個術語我應該首先查找並閱讀?你會如何去做這件事?

請注意,這些示例已經過簡化:在我的代碼中,我繼承AutodropImage,例如Autodrop,這是從AutodropGallery < Autodrop中調用的。後者已經知道AutodropImage的所有元數據,所以我主要希望避免AutodropImage再次重負。

回答

1

你在你的類方法from_entry創建變量@drop_entry一個實例,顯然它不會提供給你的對象,你是在創造這種方法。一種解決方法是在初始化類時將其作爲參數傳遞。如果您做如下修改它應該工作:

  1. 在你from_entry類方法的改變

    self.initialize(@drop_entry) 
    

    new(@drop_entry) 
    
  2. 修改initialize方法:

    def initialize(drop_entry) 
        @drop_entry = drop_entry 
        @path = @drop_entry.path 
    end 
    

或者如果你的班級只能通過path參數,即。你不想改變其他現有的代碼,那麼你可以使用一個可選的參數下降條目像這樣

def initialize(path, drop_entry=nil) 
0

您需要將元數據緩存在類變量中。

編輯:或在一個類級別的實例變量。 也許這讀將幫助:http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/

+0

這就是我雖然。但是,我沒有提到這是在Sinatra中使用的。我被告知class @@變量在所有用戶/線程中共享。但我可能會在那裏誤導。 – berkes 2010-06-04 09:31:30

+0

但您沒有使用您正在使用實例變量的類變量 – nas 2010-06-04 11:16:07

相關問題