Zacznijmy od łatwiejszego przykładu. że mamy tablicę ciągów chcemy mieć w czapkach:
['foo', 'bar', 'blah'].map { |e| e.upcase }
# => ['FOO', 'BAR', 'BLAH']
Ponadto, można tworzyć tak zwane obiekty proc (closures):
block = proc { |e| e.upcase }
block.call("foo") # => "FOO"
można przekazać taką proc Do metoda ze składnią &:
block = proc { |e| e.upcase }
['foo', 'bar', 'blah'].map(&block)
# => ['FOO', 'BAR', 'BLAH']
Co to jest wezwanie to_proc na bloku, a następnie wywołuje, że dla każdego bloku:
some_object = Object.new
def some_object.to_proc
proc { |e| e.upcase }
end
['foo', 'bar', 'blah'].map(&some_object)
# => ['FOO', 'BAR', 'BLAH']
Teraz Rails najpierw dodano metodę to_proc do symbolu, który później został dodany do biblioteki rdzenia Ruby
:whatever.to_proC# => proc { |e| e.whatever }
Dlatego można to zrobić:
['foo', 'bar', 'blah'].map(&:upcase)
# => ['FOO', 'BAR', 'BLAH']
także Symbol # to_proc jest jeszcze bardziej inteligentny, ponieważ faktycznie wykonuje następujące czynności:
:whatever.to_proC# => proc { |obj, *args| obj.send(:whatever, *args) }
Oznacza to, że
[1, 2, 3].inject(&:+)
równa
[1, 2, 3].inject { |a, b| a + b }
Fyi Twój przykład jest źle, powinien przeczytać '[1,2,3] .inject (&: +)' –
I podwójne zaznaczone, [1,2,3] .inject (: +) zdecydowanie działa. Czemu? – Valentin
To musi być cecha metody "wstrzyknąć". 'inject (: +)' nie jest Symbolem # to_proc, ': +' nie ma specjalnego znaczenia w języku ruby - to tylko symbol. –