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"