Computer >> Máy Tính >  >> Lập trình >> Ruby

9 tính năng mới trong Ruby 2.4

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ủa Ruby 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!