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

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

Okładka posta: Co się stanie, jeśli wywołasz [1, 2, 3].map(&Person)
Spis treściKliknij link, aby przejść do wybranego miejsca
Ta treść została automatycznie przetłumaczona z ukraińskiego.
```html
Na pierwszy rzut oka taki kod wydaje się dziwny - zazwyczaj piszemy map(&:to_s) lub map { |x| ... }. Ale Ruby pozwala przekazywać nie tylko symbole, ale i dowolne obiekty po &, jeśli mogą zostać przekształcone na Proc za pomocą metody to_proc.
Kiedy Ruby widzi &Person, wywołuje: Person.to_proc
To znaczy, że próbuje przekształcić Person w obiekt Proc.
Uzyskany obiekt Proc jest używany jako blok dla metody map.
Następnie Ruby dla każdego elementu tablicy wywołuje ten Proc - proc.call(element)
Przykład
class Person
  def initialize(name)
    @name = name
  end

  def self.to_proc
    ->(name) { new(name) }
  end
end

people = ["Bant", "Yuki", "Beanie"].map(&Person)
p people
Wynik:
[#<Person:0x0000000103f2b3a8 @name="Bant">,
 #<Person:0x0000000103f2b0b0 @name="Yuki">,
 #<Person:0x0000000103f2adb8 @name="Beanie">]
Co tak naprawdę dzieje się pod maską?
Ruby wywołuje twój Person.to_proc, który zwraca lambdę:
->(name) { Person.new(name) } # zauważ, że w metodzie pominęliśmy Person (nie trzeba podawać)
I następnie faktycznie wykonuje to samo, co:
["Oleh", "Ira", "Marta"].map { |name| Person.new(name) }

Jak działa .call?

Każdy Proc lub lambda ma metodę .call, która uruchamia zapisany wewnątrz kod. To znaczy, że kiedy Ruby wykonuje proc.call(element), faktycznie wykonuje twój blok:
my_proc = ->(x) { puts "Hello, #{x}" }
my_proc.call("Ruby")  # => "Hello, Ruby"
Krótko mówiąc:
  • &obj w Ruby → wywołuje obj.to_proc.
  • Wynik musi być Proc lub lambda.
  • Następnie Ruby wywołuje proc.call(x) dla każdego elementu.
  • Dlatego map(&Person) działa, jeśli klasa ma metodę self.to_proc.
Ostatni punkt omówimy nieco dokładniej. Jeśli klasa nie ma metody .to_proc - oczekuj błędu. Dlaczego?
[1, 2, 3].map(&123)
Co robi Ruby:
  1. widzi &123
  2. myśli: “aha, trzeba wywołać 123.to_proc”
  3. ale w liczbach (Integer) nie ma metody to_proc
  4. więc - błąd
irb(main):001> 123.to_proc
(irb):1:in `<main>': undefined method `to_proc' for 123:Integer (NoMethodError)

123.to_proc
   ^^^^^^^^
Did you mean?  to_r
	from /Users/mykyta/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/irb-1.15.2/exe/irb:9:in `<top (required)>'
	from /Users/mykyta/.rbenv/versions/3.2.1/bin/irb:25:in `load'
	from /Users/mykyta/.rbenv/versions/3.2.1/bin/irb:25:in `<main>'
irb(main):002> 
```

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
28 paź 14:42

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

Нотатки про 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
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
Czym jest memoizacja w Ruby?
30 paź 10:17

Czym jest memoizacja w Ruby?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
is_a?, kind_of?, instance_of? — jak Ruby sprawdza typ obiektu?
30 paź 19:55

is_a?, kind_of?, instance_of? — jak Ruby sprawdza typ obiektu?

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