Cała oryginalna treść jest tworzona po ukraińsku. Nie wszystkie treści zostały jeszcze przetłumaczone. Niektóre posty mogą być dostępne tylko po ukraińsku.Dowiedz się więcej

Jak działa &:to_s w Ruby i co to jest Symbol#to_proc

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.

Jak działają tablice w Ruby: praktyczne przykłady each, map, select, inject, reduce, filter_map
28 paź 10:38

Jak działają tablice w Ruby: praktyczne przykłady each, map, select, inject, reduce, filter_map

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Jak działa self, protected i private (Ruby)
28 paź 13:52

Jak działa self, protected i private (Ruby)

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Dzielenie całkowite w Ruby: dlaczego 6 / 4 równa się 1
28 paź 14:10

Dzielenie całkowite w Ruby: dlaczego 6 / 4 równa się 1

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Co to jest Proc i Lambda w Ruby?
28 paź 15:57

Co to jest Proc i Lambda w Ruby?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Co się stanie, jeśli wywołasz [1, 2, 3].map(&Person)
29 paź 17:54

Co się stanie, jeśli wywołasz [1, 2, 3].map(&Person)

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Klasa Singleton (eigenclass) w Ruby: co to jest i po co to potrzebne
29 paź 18:29

Klasa Singleton (eigenclass) w Ruby: co to jest i po co to potrzebne

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
==, equal?, eql?, === w Ruby: co sprawdzają i kiedy używać
29 paź 20:47

==, equal?, eql?, === w Ruby: co sprawdzają i kiedy używać

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Include, Extend, Prepend w Ruby: jak działają i jaka jest różnica
29 paź 21:20

Include, Extend, Prepend w Ruby: jak działają i jaka jest różnica

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
module_function w Ruby: kiedy metody modułu są dostępne jako modułowe i jako funkcje
29 paź 21:53

module_function w Ruby: kiedy metody modułu są dostępne jako modułowe i jako funkcje

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska