What’s new in Ruby 2.5
Bài đăng này đã không được cập nhật trong 6 năm
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.
Thêm phương thức Hash#transform_keys
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}
Array#prepend and Array#append
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"]
rescue/else/ensure đã cho phép đặt bên trong khối do/end mà không cần tới begin/end
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
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"
Ruby 2.5 đã xóa bỏ top-level constant lookup
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
ERB#result_with_hash
Đ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"
Dir.children and Dir.each_child
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']
Tính năng từ thư viện ActiveSupport
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}
Kernel#yield_self
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
Tài liệu tham khảo
- 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!
All rights reserved