2011-04-21 73 views
0

我試圖創建一個類,做了幾件事情: 1)實現自定義的getter的屬性 2)調用自定義的getter從初始化方法中調用自定義的getter方法從內部初始化

這裏是什麼樣子:

class Book 

    # RSolr lib for interacting with Solr 
    require 'rsolr' 

    # Instance variables 
    @isbn 
    @title 

    # Solr playlist instance URL 
    @solr_domain 
    @solr 

    def initialize(isbn) 
    @solr_domain = "http://solr.com:9003/solr" 
    @solr = RSolr.connect :url => @solr_domain 
    @isbn = isbn 
    @title = self.title(isbn) 
    end 

    # Get Solr URL 
    def solr_domain 
    return @solr_domain 
    end 

# Set Solr URL and reset Solr connection object 
    def solr_domain(newurl) 
    @solr_domain = newurl 
    @solr = RSolr.connect :url => @solr_domain 
    end 

    # Custom getter for title 
    def title=(isbn) 
    result = solr.get 'select', :params => {:q => 'isbn:(' + isbn + ')'} 
    return result["response"]["docs"][0]["title"] 
     end 
end 

的關鍵線

@title = self.title(isbn) 

,我們試圖呼籲針鋒相對的吸氣劑le,以便在對象初始化時設置標題。

我們想要的是一個可公開訪問的標題吸氣器,以及在對象初始化期間填充@title的方法。

回答

2

爲了能夠預置標題,你可以做這樣的事情:

def initialize(isbn, user_title = nil) 
    ... 
    @title = user_title || self.title(isbn) 
end 

有一個可選的參數,用戶可以提供。如果他/她這樣做,@title將被設置爲該值,否則我們將使用ISBN自己查找標題。我希望我正確理解你...

編輯:順便說一句,你確定你想要類級別的實例變量?

http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/

+0

嗯。感謝這個想法。這似乎應該工作,但是當我將@ title = self.title(isbn)添加到initialize方法時,當嘗試實例化新的Book對象時,出現「ArgumentError:錯誤的參數數量(1代表0)」 。 (我也爲這個類添加了一個attr_accessor:標題) – Sly 2011-04-21 19:09:39

+0

忘記我對'attr_accessor'所說的話,我沒有正確閱讀你的例子。 – 2011-04-21 19:18:16

+0

好的。這個錯誤與我打電話給self.title的方式有關。它應該是self.title = isbn,而不是@title = self.title(isbn)。而且,我改變了標題方法以在其中設置@title,而不是在initialize中明確地設置它。我會給你這個,因爲你讓我指出了正確的方向。感謝關於類和實例變量之間差異的額外鏈接 - 非常有幫助! – Sly 2011-04-21 20:58:50

1

我不完全相信你正在嘗試做的,但我覺得你混淆了一個實例的類和實例變量的實例變量。如果您直接在課程體內編寫@...,那麼將會是前者,如果您在實例方法定義中編寫@...,則它將成爲後者。看來你只是想要後者。以下可能是你想要的。在這裏,我設置solr_domaintitle作爲獲取者,因此在某些外部類別A中,對於某些Bookb實例,可以使用b.solr_domainb.title來獲取它們。在Book之內,您不需要通過獲取者訪問變量。直接訪問他們的名字@...不那麼令人困惑,因此可能會減少錯誤。

class Book 
    require 'rsolr' 
    attr_reader :solr_domain, :title 
    def initialize(isbn) 
    set_solr_domain("http://solr.com:9003/solr") 
    @isbn = isbn 
    @title = set_title 
    end 
    def set_solr_domain(newurl) 
    @solr_domain = newurl 
    @solr = RSolr.connect(:url => @solr_domain) 
    end 
    def set_title 
    @solr.get('select', :params => {:q => "isbn:(#@isbn)"})["response"]["docs"][0]["title"] 
    end 
end