从initialize中调用自定义getter方法

时间:2011-04-21 17:55:26

标签: ruby object initialization

我正在尝试创建一个可以执行以下操作的类: 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的方法。

2 个答案:

答案 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_domaintitle设置为getter,因此在某些外部类A中,对于Book b的某个实例,您可以执行{{1}或} b.solr_domain来获取它们。在b.title内,您不需要通过getter访问变量。通过名称Book直接访问它们不那么容易混淆,因此可能会减少错误。

@...