Вызовите собственный метод получения из инициализации - PullRequest
0 голосов
/ 21 апреля 2011

Я пытаюсь создать класс, который делает пару вещей: 1) Реализует пользовательский геттер для атрибута 2) Вызывает пользовательский метод получения из метода инициализации

Вот как это выглядит:

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)

, где мы пытаемся вызвать метод получения заголовка, чтобы заголовок был установлен при инициализации объекта.

Нам нужен общедоступный метод получения заголовка, а также способ заполнения @title во время инициализации объекта.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

Чтобы иметь возможность предварительно установить заголовок, вы можете сделать что-то вроде этого:

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/

1 голос
/ 21 апреля 2011

Я не совсем уверен, что вы пытаетесь сделать, но я чувствую, что вы путаете переменные экземпляра класса и переменные экземпляра экземпляра.Если вы прямо напишите @... в теле класса, это будет первое, если вы напишите @... в определении метода экземпляра, это будет последнее.Кажется, вы просто хотите последнее.Следующее, вероятно, то, что вы хотите.Здесь я устанавливаю solr_domain и title как получатели, поэтому в некотором внешнем классе A для некоторого экземпляра Book b вы можете сделать b.solr_domain или b.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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...