Явно возвращает n значений в Symbol # to_proc - PullRequest
4 голосов
/ 25 января 2012

I обнаружил сегодня вечером , что Ruby's Symbol#to_proc обрабатывает дополнительные полученные значения, помимо первого, в качестве аргументов вызова метода.Другими словами, эти два вызова методов эквивалентны:

yields_three{ |a,b,c| a.foo(b,c) }
yields_three( &:foo )

Я подумал, что это может быть мощной (или, по крайней мере, забавной) идиомой для изучения, и поэтому я попробовал следующее:

class Player
  def add_score( points )
    @score += points
  end
end

my_array_of_players.zip( my_array_of_turn_scores ).each(&:add_score)

К сожалению, это не работает:

NoMethodError: undefined method `add_score' for [<#Player 'Phrogz'>, 42]:Array

Итак, вопрос: вы можете написать метод Enumerator#explicitly, который вместо выдачи одного массива значений дает все их явно?

Если вы успешны, они должны работать:

pairs = [[1,2],[3,4],[5,6]]
pairs.map.explicitly(&:+) #=> [3,7,11]
pairs.map.explicitly(&:*) #=> [2,12,30]

class String
  def say_hey(b)
    puts "#{self} says 'hey' to #{b}"
  end
end
('a'..'d').each_cons(2).explicitly(&:say_hey)
#=> "a says 'hey' to b"
#=> "b says 'hey' to c"
#=> "c says 'hey' to d"

1 Ответ

5 голосов
/ 25 января 2012

Вот как вы можете это сделать:

class Enumerator
  def explicitly
    each { |e| yield(*e) }
  end
end

Я выполнил ваши тесты против этого, и вернулись правильные результаты.

ОБНОВЛЕНИЕ: изменено, чтобы не захватывать блок явно.

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