What’s new in Ruby 2.5
Ngôn ngữ Ruby ngày càng được ổn định qua nhiều năm. Việc phát hành sắp tới của Ruby 2.5 sẽ giới thiệu rất nhiều tính năng và cải tiến mới so với phiên bản trước. Bài viết này sẽ được giới thiệu một số thay đổi thú vị và quan trọng nhất trong phiên ản này. Từ Ruby 2.4 đã được thêm phương thức ...
Ngôn ngữ Ruby ngày càng được ổn định qua nhiều năm. Việc phát hành sắp tới của Ruby 2.5 sẽ giới thiệu rất nhiều tính năng và cải tiến mới so với phiên bản trước. Bài viết này sẽ được giới thiệu một số thay đổi thú vị và quan trọng nhất trong phiên ản này.
Từ Ruby 2.4 đã được thêm phương thức Hash#transform_values, nay đến Ruby 2.5 các nhà phát triển đã thêm phương thức Hash#transform_keys để tạo thành một cặp hoàn hảo. Hash#transform_keys có thể thay đổi giá trị của các keys trongg một hash. Ví dụ
hash = { a: 1, b: 2 } => {:a=>1, :b=>2} hash.transform_keys { |k| k.to_s } => {"a"=>1, "b"=>2} hash => {:a=>1, :b=>2}
transform_keys! là một phiên bản destructive:
hash = { a: 1, b: 2 } => {:a=>1, :b=>2} hash.transform_keys! { |k| k.to_s } => {"a"=>1, "b"=>2} hash => {"a"=>1, "b"=>2}
Ruby 2.5 mang đến hai bí danh mới(aliases) cho hai hoạt động được sử dụng nhiều nhất trong ngôn ngữ này. Array#prepend và Array#append có tên thân thiện hơn so với Array#unshift và Array#push.
>> a = ["hello"] => ["hello"] >> a.append "world" => ["hello", "world"] >> a.prepend "Hi" => ["Hi", "hello", "world"]
Chúng ta có thể viết rescue/else/ensure đặt trong khối do/end mà không cần tới begin/end
[1].each do |n| n / 0 rescue # rescue else # else ensure # ensure end
String#delete_prefix/delete_suffix có thể xóa bỏ tiền tố và hậu tố của một chuỗi
'invisible'.delete_prefix('in') #=> "visible" 'pink'.delete_prefix('in') #=> "pink" 'worked'.delete_suffix('ed') #=> "work" 'medical'.delete_suffix('ed') #=> "medical"
Trong Ruby 2.4, đoạn code sau sẽ có một cảnh báo
class Staff; end class ItemsController; end Staff::ItemsController #=> warning: toplevel constant ItemsController referenced by Staff::ItemsController #=> ItemsController
Điều này là bởi vì các hằng số ở mức cao nhất được định nghĩa trong class Object, và Ruby cố tìm kiếm class cha của class Staff, và cuối cùng tìm thấy ItemsController dưới class Object mà là class cha của Staff. Các chi tiết đã được thảo luận ở đây Nhưng đối với Ruby 22.5 thì ta không thể làm được điều này nữa:
Staff::ItemsController #=> NameError: uninitialized constant Staff::ItemsController # Did you mean? ItemsController
Đoạn code dưới đây là cách gán biến cục bộ trong ERB template trong Ruby 2.4:
require 'erb' require 'ostruct' namespace = OpenStruct.new(a: 2, b: 3) template = 'Result: <%= a * b %>' ERB.new(template).result(namespace.instance_eval { binding }) #=> "Result: 6"
Nhưng trong Ruby 22.5, ta có thể viết lại với ERB#result_with_hash:
require 'erb' template = 'Result: <%= a * b %>' ERB.new(template).result_with_hash(a: 2, b: 3) #=> "Result: 6"
Khi bạn sử dụng phương thức Dir.entries:
Dir.entries('./test/dir_a') #=> [".", "..", "code_a.rb", "text_a.txt"]
Nếu bạn muốn xóa ., .. từ kết quả trả về, bạn có thể sử dụng Dir.children:
Dir.children('./test/dir_a') #=> ['code_a.rb', 'text_a.txt']
Dir.each_child không trả về một Array nhưng là một đối tượng Enumerator. Vì vậy bạn có thể sử dụng mọi phương thức của Enumerator:
Dir.each_child('./test/dir_a') #=> #<Enumerator: Dir:each_child("./test/dir_a")>" Dir.each_child('./test/dir_a').to_a #=> ['code_a.rb', 'text_a.txt']
Trong vài năm qua, Ruby đã được sáp nhập các tính năng tốt nhất từ thư viện ActiveSupport, thành ngôn ngữ cốt lõi. Trong phiên bản Ruby 2.5, Hash#slice, Hash # slice !, Hash # except, Hash # except! là các phương thức tiếp tục xu hướng, được nhập từ ActiveSupport.
{a: 1, b: 2, c: 3}.slice(:a, :b) #=> {:a=>1, :b=>2}
Phương thức yield_self đã được giới thiệu. Đây là phương thức có tham số là một block và trả về giá trị của block đó:
2.yield_self { |n| n * 10 } #=> 20
- https://blog.redpanthers.co/whats-new-ruby-2-5/
- https://github.com/ruby/ruby/blob/v2_5_0/NEWS
- https://www.ruby-lang.org/en/news/2017/12/25/ruby-2-5-0-released/
Để xem thêm những tính năng khác. Các bạn có thể xem ở đây : https://github.com/ruby/ruby/blob/v2_5_0/NEWS. Xin cám ơn các bạn đã đọc bài viết này!