Nowe funkcje w Ruby 2.3 i 2.4
Dobrze jest być na bieżąco z nowymi funkcjami językowymi, które pomogą w grze w golfa. W najnowszych Rubinach jest kilka świetnych.
Ruby 2.3
Operator bezpiecznej nawigacji: &.
Gdy wywołujesz metodę, która może zwrócić, nil
ale chcesz połączyć dodatkowe wywołania metody, jeśli tak nie jest, marnujesz bajty na obsługę nil
sprawy:
arr = ["zero", "one", "two"]
x = arr[5].size
# => NoMethodError: undefined method `size' for nil:NilClass
x = arr[5].size rescue 0
# => 0
„Operator bezpiecznej nawigacji” zatrzymuje łańcuch wywołań metod, jeśli jeden zwraca nil
i zwraca nil
całe wyrażenie:
x = arr[5]&.size || 0
# => 0
Array#dig
I Hash#dig
Głęboki dostęp do zagnieżdżonych elementów o ładnej krótkiej nazwie:
o = { foo: [{ bar: ["baz", "qux"] }] }
o.dig(:foo, 0, :bar, 1) # => "qux"
Zwraca, nil
jeśli trafi w ślepy zaułek:
o.dig(:foo, 99, :bar, 1) # => nil
Enumerable#grep_v
Odwrotność — Enumerable#grep
zwraca wszystkie elementy, które nie pasują do podanego argumentu (w porównaniu z ===
). Na przykład grep
, jeśli podano blok, jego wynik jest zwracany.
(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
Zwraca Proc, który zwraca wartość dla danego klucza, co może być bardzo przydatne:
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 nie jest jeszcze dostępny, ale będzie dostępny wkrótce i będzie miał kilka wspaniałych funkcji. (Po wydaniu zaktualizuję ten post, dodając linki do dokumentów.) O większości z nich dowiedziałem się w tym świetnym wpisie na blogu .
Enumerable#sum
Nie więcej arr.reduce(:+)
. Możesz teraz po prostu zrobić arr.sum
. Pobiera opcjonalny argument wartości początkowej, który domyślnie wynosi 0 dla elementów numerycznych ( [].sum == 0
). W przypadku innych typów musisz podać wartość początkową. Akceptuje również blok, który zostanie zastosowany do każdego elementu przed dodaniem:
[[1, 10], [2, 20], [3, 30]].sum {|a,b| a + b }
# => 66
Integer#digits
Zwraca tablicę cyfr liczby w kolejności od najmniejszego do największego znaczenia:
123.digits # => [3, 2, 1]
W porównaniu, powiedzmy, 123.to_s.chars.map(&:to_i).reverse
jest to całkiem miłe.
Jako bonus wymaga opcjonalnego argumentu Radix:
a = 0x7b.digits(16) # => [11, 7]
a.map{|d|"%x"%d} # => ["b", "7"]
Comparable#clamp
Czy to, co jest napisane na puszce:
v = 15
v.clamp(10, 20) # => 15
v.clamp(0, 10) # => 10
v.clamp(20, 30) # => 20
Ponieważ jest porównywalny, możesz go używać z dowolną klasą zawierającą porównywalne, np .:
?~.clamp(?A, ?Z) # => "Z"
String#unpack1
2-bajtowe oszczędności w porównaniu z .unpack(...)[0]
:
"👻💩".unpack(?U) # => [128123]
"👻💩".unpack(?U)[0] # => 128123
"👻💩".unpack1(?U) # => 128123
Argument dokładność Numeric#ceil
, floor
oraztruncate
Math::E.ceil(1) # => 2.8
Math::E.floor(1) # => 2.7
(-Math::E).truncate(1) # => -2.7
Wielokrotne przypisanie warunków warunkowych
To powoduje błąd we wcześniejszych wersjach Ruby, ale jest dozwolone w 2.4.
(a,b=1,2) ? "yes" : "no" # => "yes"
(a,b=nil) ? "yes" : "no" # => "no"