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.
Dieser Beitrag hat noch keine Ergänzungen vom Autor.