我正在尝试创建一个可以执行以下操作的类: 1)为属性实现自定义getter 2)从initialize方法
中调用自定义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)
我们尝试调用getter获取title,以便在初始化对象时设置title。
我们想要的是一个可公开访问的标题获取器,以及在初始化对象期间填充@title的方法。
答案 0 :(得分:2)
为了能够预设标题,您可以这样做:
def initialize(isbn, user_title = nil)
...
@title = user_title || self.title(isbn)
end
用户可以提供可选参数。如果他/她这样做,@title
将设置为该值,否则我们将使用ISBN查找标题。我希望我能正确理解你......
编辑:BTW,你确定要的是类级实例变量吗?
http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/
答案 1 :(得分:1)
我不确定你要做什么,但我觉得你混淆了一个类的实例变量和一个实例的实例变量。如果你直接在类体中写@...
,那将是前者,如果你在实例方法定义中编写@...
,它将是后者。看来你只想要后者。以下可能就是你想要的。在这里,我将solr_domain
和title
设置为getter,因此在某些外部类A
中,对于Book
b
的某个实例,您可以执行{{1}或} b.solr_domain
来获取它们。在b.title
内,您不需要通过getter访问变量。通过名称Book
直接访问它们不那么容易混淆,因此可能会减少错误。
@...