Рубиновые блоки и доходность - PullRequest
0 голосов
/ 04 января 2011

Что такое

yield self if block

означает ли это, что если бы к методу инициализации был присоединен блок, его бы вызвали в конце?

def initialize options = {}, &block

  @type = self.class.to_s.split('::').last.downcase.to_sym
  @version = options.delete(:version) || 1.0
  @language = options.delete(:language) || :en
  @query = options.delete(:query)
  @api_key = options.delete(:key) || :notsupplied
  @options = options
  raise Error, 'Do not initialize Google::Search; Use a subclass such as  Google::Search::Web' if @type == :search
  yield self if block

Ответы [ 2 ]

2 голосов
/ 04 января 2011

Когда вы пишете метод, подобный этому:

def foo( a, b, &c )
  ...
end

Тогда переменная c устанавливается на экземпляр Proc, если вы передаете блок методу, или устанавливается на nil, если вы не используетене пройти блок.Поскольку nil является неверным значением, метод, который вы цитируете, проверяет, был ли передан блок, чтобы решить, следует ли уступать или нет.

Как говорит @ MarcAndréLafortune, лучше код:*.Единственный раз, когда вы хотите захватить блок (о котором я могу подумать):

  1. Чтобы сохранить его в переменной экземпляра для использования позже:
    • например, @foo = cа затем позже либо вызовите его и передайте значения (@foo[ 42 ]), либо передайте его как блок другому методу my_array.select(&@foo).
  2. Или передайте его непосредственно как блокдля других методов, вызываемых вашим методом:
    • например, @my_array = initial_values.select(&c)
2 голосов
/ 04 января 2011

Да, в значительной степени.Таким образом, вы можете сделать что-то вроде:

Google::Search::Web.new do |search|
  # ...
end

(Хотя, с точки зрения разработки программного обеспечения, выполнение пользовательского кода в конструкторе всегда казалось мне странным. Лучший подход - это то, что File иIO do, где open делает почти то же самое, что и new, за исключением того, что open выполняет переданный блок, тогда как new не делает.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...