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#prependArray#append có tên thân thiện hơn so với Array#unshiftArray#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

Để 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!