← StartseiteProgrammierung (Програмування)

Was bedeutet .map(&:name) in Ruby?

Was bedeutet .map(&:name) in Ruby? Beispiele für die Verwendung der Kurzschreibweise von map.

InhaltsverzeichnisKlicke auf den Link, um zur gewünschten Stelle zu navigieren
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
```html
In Ruby ist die Konstruktion map(&:name) eine Abkürzung für die Anwendung einer Methode auf jedes Element einer Sammlung. Diese Form wird verwendet, um den Code kürzer und lesbarer zu machen. Lassen Sie uns genauer betrachten, was dieser Ausdruck bedeutet.
Die Methode map wird verwendet, um jedes Element einer Sammlung zu durchlaufen (Iteration) und einen Codeblock für jedes Element auszuführen. Als Antwort wird ein neues Array mit den Ergebnissen der Ausführung des Blocks zurückgegeben.
[1, 2, 3].map { |n| n * 2 }
# => [2, 4, 6]

Was bedeutet &:name?

Dieser (&:name im Ausdruck array.map(&:name)) Teil wird verwendet, um den Block zu verkürzen, der die Methode name für jedes Element aufruft. Er ist äquivalent zu:
array.map { |item| item.name }
Das heißt:
# Das hier:
array.map { |item| item.name }
# Und das hier:
array.map(&:name)
# Führt die gleiche Aktion aus, aber die zweite Variante hat eine verkürzte Form

Beispiel

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"]

# Versuchen wir die 'längere' Variante
names = users.map{ |user| user.name }
# => ["Alice", "Bob", "Charlie"]
Wie wir sehen, machen beide Varianten dasselbe. Und wie sieht es mit der Performance aus? Lassen Sie uns die Benchmarks überprüfen.

Benchmarks

require 'benchmark'

class User
  attr_accessor :name

  def initialize(name)
    @name = name
  end
end

# Generierung eines großen Arrays von Benutzern
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
Das Ergebnis auf meinem Rechner:
[#<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>]
Insgesamt ist die verkürzte Variante optimierter und schneller. Aber in meinem Beispiel ist das Ergebnis ungefähr gleich. Man braucht einen größeren Datensatz, damit der Benchmark einen Unterschied zeigt. Daher sollten Sie standardmäßig die verkürzte (optimierte Version) des Aufrufs der Methode map verwenden. Vielleicht werde ich einen separaten Beitrag mit Benchmarks machen.
```

🔥 Weitere Beiträge

Alle Beiträge
Wie macht man einen leeren Git-Commit?
Programmierung (Програмування)28. Jun '24, 08:33 Uhr

Wie macht man einen leeren Git-Commit?

Wie macht man einen leeren Git-Commit? Wir machen einen leeren Git-Commit. Warum? Wer weiß, jeder...

Was ist eine idempotente Methode?
Programmierung (Програмування)21. Aug '24, 20:57 Uhr

Was ist eine idempotente Methode?

Was ist eine idempotente Methode? Beschreibung und Beispiele für idempotente Methoden in der Prog...

Was ist ein Repository?
Programmierung (Програмування)21. Aug '24, 21:25 Uhr

Was ist ein Repository?

Was ist ein Repository? Wozu wird es benötigt und wie funktioniert es?