Spis treściKliknij link, aby przejść do wybranego miejsca
Ta treść została automatycznie przetłumaczona z ukraińskiego.
W Ruby często spotyka się skróconą notację dla iteracji:
[1, 2, 3].map(&:to_s)
To to samo, co:
[1, 2, 3].map { |n| n.to_s }
Ale jak dokładnie działa konstrukcja &:to_s?
Symbol#to_proc
Kluczowa idea polega na tym, że Ruby pozwala na przekształcanie symboli w bloki za pomocą metody to_proc.
- Symbol :to_s reprezentuje nazwę metody.
- Metoda to_proc przekształca symbol w blok, który wywołuje odpowiednią metodę na każdym elemencie kolekcji.
- Operator & informuje Ruby, że ten blok należy przekazać do metody (map, each itp.).
Można to zobaczyć tak:
s = :to_s p = s.to_proc [1, 2, 3].map(&p) # => ["1", "2", "3"]
To znaczy &:to_s — to skrócona notacja dla &(:to_s.to_proc)
Jeśli po prostu:
Kiedy piszemy &:to_s, bierze każdy element tablicy i wywołuje na nim metodę to_s.
To znaczy, że ten zapis:
[1, 2, 3].map(&:to_s)
oznacza to samo, co:
[1, 2, 3].map { |n| n.to_s }
&:to_s - to po prostu krótki sposób na powiedzenie "wywołaj metodę to_s na każdym elemencie". Ruby sam "rozwija" ten symbol w zwykły blok.
Przykłady
1. Przekształcanie liczb w ciągi
numbers = [1, 2, 3] strings = numbers.map(&:to_s) # => ["1", "2", "3"]
2. Wywoływanie innych metod
words = ["hello", "world"] capitalized = words.map(&:upcase) # => ["HELLO", "WORLD"]
3. Wywoływanie własnych metod obiektu
class Person
attr_reader :name
def initialize(name)
@name = name
end
end
people = [Person.new("Alice"), Person.new("Bob")]
names = people.map(&:name)
# => ["Alice", "Bob"]
Jak lubi pisać SI - Wnioski:
- &:method_name - to skrócona notacja dla &(:method_name.to_proc).
- Ruby przekształca symbol w blok za pomocą Symbol#to_proc, który wywołuje metodę na każdym elemencie kolekcji.
- To sprawia, że kod jest krótszy i bardziej czytelny.
Konstrukcja &:to_s lub &:name jest bardzo wygodna dla kolekcji, gdy trzeba wywołać jedną metodę na wszystkich elementach.
Ten post nie ma jeszcze żadnych dodatków od autora.