2011-04-21 97 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