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 oznacza .map(&:name) w Ruby?

Okładka posta: Co oznacza .map(&:name) w Ruby?
Spis treściKliknij link, aby przejść do wybranego miejsca
Ta treść została automatycznie przetłumaczona z ukraińskiego.
W Ruby konstrukcja map(&:name) jest skrótem do zastosowania metody do każdego elementu kolekcji. Ta forma jest używana, aby kod był krótszy i bardziej czytelny. Przyjrzyjmy się dokładniej, co dokładnie oznacza ten wyraz.
Metoda map jest używana do przechodzenia przez każdy element kolekcji (iteracja) i wykonywania bloku kodu dla każdego elementu. W odpowiedzi zwracany jest nowy tablica z wynikami wykonania bloku.
[1, 2, 3].map { |n| n * 2 }
# => [2, 4, 6]

Co oznacza &:name?

Ta (&:name w wyrażeniu array.map(&:name)) część jest używana do skrócenia bloku, który wywołuje metodę name dla każdego elementu. Jest to równoważne:
array.map { |item| item.name }
To znaczy:
# Oto to:
array.map { |item| item.name }
# A to:
array.map(&:name)
# Wykonuje tę samą akcję, ale druga wersja ma skróconą formę

Przykład

class User
  attr_accessor :name

  def initialize(name)
    @name = name
  end
end

users = [User.new('Alice'), User.new('Bob'), User.new('Charlie')]
names = users.map(&:name)
# => ["Alice", "Bob", "Charlie"]

# Spróbujmy 'dłuższej' wersji
names = users.map{ |user| user.name }
# => ["Alice", "Bob", "Charlie"]
Jak widzimy, obie wersje robią to samo. A co z wydajnością? Sprawdźmy benchmarki.

Benchmarki

require 'benchmark'

class User
  attr_accessor :name

  def initialize(name)
    @name = name
  end
end

# Generowanie dużej tablicy użytkowników
users = Array.new(100_000) { |i| User.new("User#{i}") }

# Benchmarking
results = Benchmark.bm do |x|
  x.report('map(&:name)') do
    users.map(&:name)
  end

  x.report('map { |user| user.name }') do
    users.map { |user| user.name }
  end
end

puts results
Wynik na mojej maszynie:
[#<Benchmark::Tms:0x000000010dd19ad0 @cstime=0.0, @cutime=0.0, @label="map(&:name)", @real=0.008466999977827072, @stime=0.00038199999999999346, @total=0.0077390000000007175, @utime=0.007357000000000724>,
 #<Benchmark::Tms:0x000000010dd19670 @cstime=0.0, @cutime=0.0, @label="map { |user| user.name }", @real=0.008027000352740288, @stime=0.0003069999999999462, @total=0.007962000000001468, @utime=0.007655000000001522>]
Ogólnie, skrócona wersja jest bardziej zoptymalizowana i szybsza. Ale w moim przykładzie wyniki są mniej więcej takie same. Należy mieć bardziej masywny zestaw danych, aby benchmark pokazał różnicę. Dlatego domyślnie używaj skróconej (optymalizowanej wersji) wywołania metody map. Może zrobię osobny wpis z benchmarkami.

Ten post nie ma jeszcze żadnych dodatków od autora.

[Fix] extconf.rb nie powiódł się podczas instalacji biblioteki Ruby Gosu
27 cze '24 16:38

[Fix] extconf.rb nie powiódł się podczas instalacji biblioteki Ruby Gosu

meme code
meme code@memecode
Jak zrobić pusty commit w gicie?
28 cze '24 08:33

Jak zrobić pusty commit w gicie?

meme code
meme code@memecode
Biblioteka Ruby Gosu do tworzenia gier 2D
29 cze '24 08:48

Biblioteka Ruby Gosu do tworzenia gier 2D

meme code
meme code@memecode
Gosu Ruby Tutorial - пройдемось по офіційній документації
3 lip '24 11:50

Gosu Ruby Tutorial - пройдемось по офіційній документації

meme code
meme code@memecode
Pisujemy demo-grę Drones vs Zombies (Gosu / Ruby)
12 lip '24 12:17

Pisujemy demo-grę Drones vs Zombies (Gosu / Ruby)

meme code
meme code@memecode
Jak naprawić awarię Windows spowodowaną przez CrowdStrike?
19 lip '24 13:53

Jak naprawić awarię Windows spowodowaną przez CrowdStrike?

meme code
meme code@memecode
Jak działa metoda map w Ruby? Przegląd działania metody z przykładami
30 lip '24 07:33

Jak działa metoda map w Ruby? Przegląd działania metody z przykładami

meme code
meme code@memecode
Co oznacza kropka na początku pliku (.gitignore, .DS_Store, .bashrc itd.)?
2 sie '24 13:15

Co oznacza kropka na początku pliku (.gitignore, .DS_Store, .bashrc itd.)?

meme code
meme code@memecode
Co to jest .gitignore? Do czego jest potrzebny i jak go używać
2 sie '24 14:58

Co to jest .gitignore? Do czego jest potrzebny i jak go używać

meme code
meme code@memecode
Jak usunąć plik .DS_Store z repozytorium Git?
2 sie '24 19:34

Jak usunąć plik .DS_Store z repozytorium Git?

meme code
meme code@memecode
Co to jest metoda idempotentna?
21 sie '24 20:57

Co to jest metoda idempotentna?

meme code
meme code@memecode
Czym jest repozytorium?
21 sie '24 21:25

Czym jest repozytorium?

meme code
meme code@memecode