Neue Funktionen in Ruby 2.3 und 2.4
Es ist gut, sich über neue Sprachfunktionen zu informieren, die Ihrem Golfspiel helfen. In den neuesten Rubinen gibt es einige großartige.
Ruby 2.3
Der sichere Navigationsbetreiber: &.
Wenn Sie eine Methode aufrufen, die möglicherweise zurückgibt, nil
aber wenn dies nicht der nil
Fall ist, möchten Sie zusätzliche Methodenaufrufe verketten, verschwenden Sie Bytes, die den Fall behandeln:
arr = ["zero", "one", "two"]
x = arr[5].size
# => NoMethodError: undefined method `size' for nil:NilClass
x = arr[5].size rescue 0
# => 0
Der "Safe Navigation Operator" stoppt die Kette von Methodenaufrufen, wenn man zurückgibt nil
und nil
für den gesamten Ausdruck zurückgibt :
x = arr[5]&.size || 0
# => 0
Array#dig
& Hash#dig
Tiefgreifender Zugriff auf verschachtelte Elemente mit einem schönen Kurznamen:
o = { foo: [{ bar: ["baz", "qux"] }] }
o.dig(:foo, 0, :bar, 1) # => "qux"
Gibt zurück, nil
wenn es eine Sackgasse erreicht:
o.dig(:foo, 99, :bar, 1) # => nil
Enumerable#grep_v
Die Umkehrung von - Enumerable#grep
gibt alle Elemente zurück, die nicht mit dem angegebenen Argument übereinstimmen (verglichen mit ===
). Wie grep
, wenn ein Block gegeben sein Ergebnis wird stattdessen zurückgegeben.
(1..10).grep_v 2..5 # => [1, 6, 7, 8, 9, 10]
(1..10).grep_v(2..5){|v|v*2} # => [2, 12, 14, 16, 18, 20]
Hash#to_proc
Gibt einen Proc zurück, der den Wert für den angegebenen Schlüssel liefert, was sehr praktisch sein kann:
h = { N: 0, E: 1, S: 2, W: 3 }
%i[N N E S E S W].map(&h)
# => [0, 0, 1, 2, 1, 2, 3]
Ruby 2.4
Ruby 2.4 ist noch nicht verfügbar, wird aber bald verfügbar sein und einige großartige kleine Funktionen bieten. (Wenn es veröffentlicht wird, aktualisiere ich diesen Beitrag mit einigen Links zu den Dokumenten.) Die meisten davon habe ich in diesem großartigen Blog-Beitrag erfahren .
Enumerable#sum
Nicht mehr arr.reduce(:+)
. Das kannst du jetzt einfach machen arr.sum
. Es wird ein optionales Anfangswertargument verwendet, das für numerische Elemente ( [].sum == 0
) den Standardwert 0 hat . Für andere Typen müssen Sie einen Anfangswert angeben. Es akzeptiert auch einen Block, der vor dem Hinzufügen auf jedes Element angewendet wird:
[[1, 10], [2, 20], [3, 30]].sum {|a,b| a + b }
# => 66
Integer#digits
Dies gibt ein Array der Ziffern einer Zahl in der Reihenfolge der niedrigsten bis höchsten Signifikanz zurück:
123.digits # => [3, 2, 1]
Im Vergleich zu sagen 123.to_s.chars.map(&:to_i).reverse
, das ist ziemlich schön.
Als Bonus gibt es ein optionales Grundargument:
a = 0x7b.digits(16) # => [11, 7]
a.map{|d|"%x"%d} # => ["b", "7"]
Comparable#clamp
Tut was es verspricht:
v = 15
v.clamp(10, 20) # => 15
v.clamp(0, 10) # => 10
v.clamp(20, 30) # => 20
Da es in Comparable enthalten ist, können Sie es mit jeder Klasse verwenden, die Comparable enthält, zB:
?~.clamp(?A, ?Z) # => "Z"
String#unpack1
Einsparungen von 2 Byte gegenüber .unpack(...)[0]
:
"👻💩".unpack(?U) # => [128123]
"👻💩".unpack(?U)[0] # => 128123
"👻💩".unpack1(?U) # => 128123
Präzisions - Argument für Numeric#ceil
, floor
undtruncate
Math::E.ceil(1) # => 2.8
Math::E.floor(1) # => 2.7
(-Math::E).truncate(1) # => -2.7
Mehrfachzuordnung in Bedingungen
Dies löst einen Fehler in früheren Ruby-Versionen aus, ist jedoch in 2.4 zulässig.
(a,b=1,2) ? "yes" : "no" # => "yes"
(a,b=nil) ? "yes" : "no" # => "no"