Việc phát hành các phiên bản Ruby mới vào Giáng sinh đã trở thành một truyền thống.
Và trong bài đăng này, tôi muốn đề cập đến một số thay đổi thú vị nhất trong Ruby 2.4 để bạn có thể cập nhật tin tức 🙂
Làm nổi # vòng với từ khóa
Nếu bạn đang sử dụng float trong ứng dụng của mình, tôi hy vọng bạn sử dụng floor
hoặc ceil
để làm tròn, vì phương thức Float # round đang thay đổi hành vi mặc định của nó trong Ruby 2.4.
Ví dụ :
# Ruby 2.3 (2.5).round 3 # Ruby 2.4 (2.5).round 2
Hành vi mặc định bây giờ là "làm tròn đến chẵn".
CẬP NHẬT :Hành vi mặc định cho
Float#round
đã quay trở lại "làm tròn" trong phiên bản cuối cùng củaRuby 2.4
. Đây là quyết định của Matz sau khi bài đăng này được xuất bản lần đầu.
Ngoài ra, Float#round
bây giờ nhận một đối số mà bạn có thể sử dụng để xác định kiểu làm tròn bạn muốn.
Các tùy chọn là:
- :thậm chí
- :up
- :xuống
Ví dụ :
(4.5).round(half: :up) 5
Ngoài ra Float#floor
, Float#ceil
&Float#truncate
bây giờ lấy một đối số tùy chọn cho phép bạn đặt độ chính xác.
Cờ chomp cho các phương thức IO
Nếu bạn đã từng sử dụng một phương pháp như get hoặc each_line, tôi chắc chắn rằng bạn nhớ phải xử lý những ký tự dòng mới khó chịu đó.
Những cái trông giống như sau:\n
.
Đây là điều mà người mới bắt đầu luôn gặp khó khăn, nhưng tính năng mới này có thể giúp ích cho bạn!
Đây là một ví dụ:
input = gets.chomp # "abc\n"
Bây giờ trong Ruby 2.4, bạn sẽ có thể thiết lập chomp
đối số từ khóa &gets
sẽ xóa ký tự dòng mới cho bạn.
Ví dụ :
input = gets(chomp: true) # "abc"
Điều này sẽ hoạt động với bất kỳ giá trị nào không phải là false
hoặc nil
(các giá trị "giả" duy nhất trong Ruby).
Vì vậy, điều này cũng hoạt động (nhưng không được khuyến khích vì nó có thể gây nhầm lẫn):
input = gets(chomp: 1234) # "abc"
Đó không phải là một vấn đề quá lớn, nhưng nó có thể giúp bạn tiết kiệm một cuộc gọi phương thức 🙂
Tên đường dẫn # trống?
Ruby 2.4 thực hiện Dir#empty?
&File#empty?
, các phương pháp này cho phép bạn kiểm tra xem một thư mục hoặc một tệp có trống không (điều đó khá rõ ràng, phải không?).
Nhưng Pathname#empty?
cũng đã được thêm gần đây.
Trong trường hợp bạn không quen thuộc với Pathname
, nó là một lớp kết hợp với nhau chức năng từ cả Dir
lớp &File
lớp học.
Ngoài ra, nó cũng có tính chất “OO” (Hướng đối tượng) hơn theo nghĩa là nó trả về Pathname
đối tượng, thay vì chuỗi.
Ví dụ :
Pathname.empty?("file or directory name")
Cam kết:https://github.com/ruby/ruby/commit/9373c5efb993dd8cae0526118805449b19af2c22
Đặt Compare_by_identity
Tập hợp là một cấu trúc dữ liệu có sẵn như một phần của thư viện chuẩn. Nó giúp bạn lưu giữ một bộ sưu tập các mặt hàng độc đáo.
Theo mặc định, các đối tượng được so sánh dựa trên giá trị của chúng (hoặc chính xác hơn là dựa trên giá trị băm của chúng).
Nhưng trong Ruby 2.4, có thể có một tập hợp các đối tượng duy nhất dựa trên id đối tượng của chúng.
Ví dụ :
require 'set' # Normal set set = Set.new set << 123 << 123 << "abc" << "abc" # [123, "abc"] # Identity set set = Set.new().compare_by_identity set << 123 << 123 << "abc" << "abc" # [123, "abc", "abc"]
Nếu ai biết về cách sử dụng thú vị nào cho tính năng này, hãy để lại bình luận 🙂
Cam kết:https://github.com/ruby/ruby/commit/76977611dd68e384fdce8c546efda5e1931e67a6
Các cải tiến với Kernel # send, BasicObject # send , Ký hiệu # to_proc
Tôi sẽ không trình bày chi tiết về các sàng lọc ở đây, nhưng ý tưởng cơ bản là có thể thêm các phương thức vào một lớp như String
, trong khi vẫn giữ thay đổi này được "bản địa hóa" thành một tệp hoặc lớp.
Kể từ Ruby 2.4, các phương thức được xác định thông qua sàng lọc sẽ khả dụng khi được gọi qua các phương thức như Kernel#send
&Symbol#to_proc
.
Ví dụ :
module TenTimes refine String do def ten_times puts self * 10 end end end class Thing using TenTimes "abc".send(:ten_times) end
Nếu bạn thử điều này trong 2.3 hoặc thấp hơn, bạn sẽ gặp lỗi 'phương pháp không xác định'.
Cam kết:https://github.com/ruby/ruby/commit/35a29390197750abf97ef16fa0740e377764daef
Băm # giá_trị_biến_đổi
Đây là một phương pháp khác được trích xuất từ Rails và đến trực tiếp với Ruby. Tôi đang nói về Hash#transform_values
, hoạt động theo cách tương tự với Array#map
.
Ví dụ :
h = {a: 1, b: 2, c: 3} h.transform_values { |v| v * 10 } # {a: 10, b: 20, c: 30}
Ngoài ra còn có Hash#transform_values!
nếu bạn cần đột biến tại chỗ.
Kernel # clone bây giờ nhận một đối số từ khóa tùy chọn
Như bạn có thể biết, có thể tạo một bản sao của một đối tượng Ruby. Điều này rất hữu ích vì hầu hết các đối tượng Ruby đều có thể thay đổi được và bạn có thể muốn tránh thực hiện các thay đổi đối với đối tượng ban đầu.
Chúng tôi có hai phương pháp để tạo một bản sao đối tượng:
- sao chép
- nhân đôi
Có một vài điểm khác biệt nhỏ giữa bản sao và bản sao, nhưng đối với bài đăng này, chúng ta hãy nói rằng clone
giữ trạng thái "đóng băng" của đối tượng ban đầu trong khi dup
không.
Điểm mới trong 2.4 là khả năng gọi clone
bằng cờ "đóng băng".
Ví dụ :
foo = "test".freeze boo = foo.clone(freeze: false) boo.frozen? # false
Tôi không chắc điều gì mở rộng này hữu ích, nhưng ai mà không muốn có thêm tùy chọn 🙂
Cam kết:https://github.com/ruby/ruby/commit/320ae01c5fb091eab0926c186f304a9caeda1ace
Thread.report_on_exception
Một tính năng khác đi kèm với 2.4 là Thread.report_on_exception. Điều này được đề xuất bởi vì các ngoại lệ của Chuỗi là im lặng theo mặc định và điều này có thể ẩn các vấn đề với mã của bạn.
Giá trị mặc định là false
, nhưng nếu ứng dụng của bạn đang sử dụng Threads, bạn nên thử bật tính năng này khi nâng cấp lên Ruby 2.4.
Ví dụ :
Thread.report_on_exception = true t1 = Thread.new do puts "In new thread" raise "Exception from thread" end sleep(1) puts "In the main thread"
Điều này sẽ hiển thị ngoại lệ, nhưng nó sẽ không làm hỏng chương trình của bạn. Thay thế là Thread.abort_on_exception, luôn có sẵn.
Lưu ý rằng cũng có một phiên bản cá thể của phương pháp này, vì vậy bạn có thể đặt tùy chọn này cho mỗi chuỗi thay vì tất cả các chuỗi.
Ràng buộc # irb
Bạn có phải là người thích sử dụng binding.pry
không để gỡ lỗi? Bây giờ chúng ta cũng có binding.irb
hoạt động theo cách tương tự.
Nhưng vì nó không hợp lệ nên bạn vẫn không nhận được tất cả những điều tốt đẹp mà pry mang lại cho bạn, chẳng hạn như tô sáng cú pháp.
Còn hơn không nếu vì lý do nào đó mà bạn không có quyền truy cập 🙂
Cam kết:https://github.com/ruby/ruby/commit/493e48897421d176a8faf0f0820323d79ecdf94a
Kết luận
Phiên bản Ruby mới này mang lại nhiều tính năng thú vị, vì vậy hãy nhớ kiểm tra khi có.
Đừng quên chia sẻ bài đăng này để nhiều người có thể học hỏi về các tính năng mới này trong Ruby 2.4!