Ruby: неявный итератор блоков

Есть ли способ сделать это? вместо:

links.each do |link|
  link.color "red"
end

сделать итератор (между | |) неявным, например:

links.each do
  color "red"
end

person themirror    schedule 07.10.2011    source источник


Ответы (2)


Я почти уверен, что это невозможно. Однако вы можете instance_eval каждый элемент, но без веской на то причины я бы его точно не рекомендовал

foo = ["test","test2","foo","bar","foobar"]

foo.each do |f|
  f.instance_eval do
    p reverse
  end
end
person Gazler    schedule 07.10.2011
comment
-1 за использование instance_eval, +1 за смелое предупреждение. Чистый ноль. Но тогда +1 за идею. :) - person Zabba; 07.10.2011

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

proc = Proc.new { |i| i.color 'red' }
links.map(&proc)
person jodell    schedule 07.10.2011