Các tính năng mới trong Ruby 2.3 và 2.4
Thật tốt khi theo kịp các tính năng ngôn ngữ mới sẽ giúp ích cho trò chơi golf của bạn. Có một vài người tuyệt vời trong Rubies mới nhất.
Ruby 2.3
Toán tử điều hướng an toàn: &.
Khi bạn gọi một phương thức có thể trả về nil
nhưng bạn muốn xâu chuỗi các cuộc gọi phương thức bổ sung nếu không, bạn sẽ lãng phí byte xử lý nil
trường hợp:
arr = ["zero", "one", "two"]
x = arr[5].size
# => NoMethodError: undefined method `size' for nil:NilClass
x = arr[5].size rescue 0
# => 0
"Toán tử điều hướng an toàn" dừng chuỗi các lệnh gọi phương thức nếu một lệnh trả về nil
và trả về nil
cho toàn bộ biểu thức:
x = arr[5]&.size || 0
# => 0
Array#dig
& Hash#dig
Truy cập sâu vào các yếu tố lồng nhau, với một tên ngắn đẹp:
o = { foo: [{ bar: ["baz", "qux"] }] }
o.dig(:foo, 0, :bar, 1) # => "qux"
Trả về nil
nếu nó đi vào ngõ cụt:
o.dig(:foo, 99, :bar, 1) # => nil
Enumerable#grep_v
Nghịch đảo ngược lại Enumerable#grep
tất cả các yếu tố không khớp với đối số đã cho (so với ===
). Giống như grep
, nếu một khối được đưa ra, kết quả của nó được trả về thay thế.
(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
Trả về một Proc mang lại giá trị cho khóa đã cho, có thể khá tiện dụng:
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 chưa ra mắt, nhưng nó sẽ sớm ra mắt và có một số tính năng nhỏ tuyệt vời. (Khi nó được phát hành, tôi sẽ cập nhật bài đăng này với một số liên kết đến các tài liệu.) Tôi đã tìm hiểu về hầu hết những điều này trong bài đăng blog tuyệt vời này .
Enumerable#sum
Không còn nữa arr.reduce(:+)
. Bây giờ bạn có thể làm arr.sum
. Nó nhận một đối số giá trị ban đầu tùy chọn, mặc định là 0 cho các phần tử Số ( [].sum == 0
). Đối với các loại khác, bạn sẽ cần cung cấp một giá trị ban đầu. Nó cũng chấp nhận một khối sẽ được áp dụng cho từng phần tử trước khi thêm:
[[1, 10], [2, 20], [3, 30]].sum {|a,b| a + b }
# => 66
Integer#digits
Điều này trả về một mảng các chữ số của một số theo thứ tự có ý nghĩa từ nhỏ nhất đến lớn nhất:
123.digits # => [3, 2, 1]
So với, nói 123.to_s.chars.map(&:to_i).reverse
, điều này là khá tốt đẹp.
Là một phần thưởng, nó cần một đối số cơ số tùy chọn:
a = 0x7b.digits(16) # => [11, 7]
a.map{|d|"%x"%d} # => ["b", "7"]
Comparable#clamp
Liệu những gì nó nói trên tin:
v = 15
v.clamp(10, 20) # => 15
v.clamp(0, 10) # => 10
v.clamp(20, 30) # => 20
Vì nó có thể so sánh, bạn có thể sử dụng nó với bất kỳ lớp nào có thể so sánh, ví dụ:
?~.clamp(?A, ?Z) # => "Z"
String#unpack1
Tiết kiệm 2 byte hơn .unpack(...)[0]
:
"👻💩".unpack(?U) # => [128123]
"👻💩".unpack(?U)[0] # => 128123
"👻💩".unpack1(?U) # => 128123
Lập luận chính xác dùng cho Numeric#ceil
, floor
vàtruncate
Math::E.ceil(1) # => 2.8
Math::E.floor(1) # => 2.7
(-Math::E).truncate(1) # => -2.7
Nhiều bài tập trong điều kiện
Điều này gây ra lỗi trong các phiên bản trước của Ruby, nhưng được phép trong 2.4.
(a,b=1,2) ? "yes" : "no" # => "yes"
(a,b=nil) ? "yes" : "no" # => "no"