+3

Có gì mới trong ruby 2.5

Mới đây Ruby 2.5.0-preview1 đã được phát hành vào ngày 10 tháng 10 năm 2017. Nó giới thiệu rất nhiều tính năng mới và cải tiến hiệu suất. Tôi đã chọn ra một số tính năng nổi bật. Tôi hy vọng bài viết này sẽ giúp chúng ta hiểu một số thay đổi sắp tới có sẵn trong Ruby 2.5

Bundler gem

Bundler giờ đây đã được đóng gói như một thư viện chuẩn. Vì vậy, chúng ta có thể sử dụng nó mà không cần chạy gem install bundler!

$ ruby -v
ruby 2.5.0preview1 (2017-10-10 trunk 60153) [x86_64-darwin16]
$ bundler -v
Bundler version 1.15.4

Kernel#yield_self

yield_self được chính thức giới thiệu . phương pháp này nhận một đối số block và trả về một block giống như nó:

2.yield_self { |n| n * 10 } #=> 20
 
names = ['Alice', 'Bob']
names.join(', ').yield_self { |s| "(#{s})" } #=> "(Alice, Bob)"

Array#prepend/append như là một bí danh của unshift/push

Array#prepend/append được thêm vào dưới dạng bí danh của các phương thức unshift/push:

array = [3, 4]
array.prepend(1, 2) #=> [1, 2, 3, 4]
array               #=> [1, 2, 3, 4]
 
array = [1, 2]
array.append(3, 4)  #=> [1, 2, 3, 4]
array               #=> [1, 2, 3, 4]

Hash#transform_keys/transform_keys

Hash#transform_keys có thể thay đổi các khóa theo giá trị trả về của một khối đó:

hash = { a: 1, b: 2 }
hash.transform_keys { |k| k.to_s }
#=> { 'a' => 1, 'b' => 2 }

Dir.children/each_child

có thể bạn đã từng 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 loại bỏ "." Và ".." từ các giá trị trả về, thì bạn có thể dùng Dir.children:

Dir.children('./test/dir_a')
#=> ['code_a.rb', 'text_a.txt']

Dir.each_child không phải trả về là một mảng mà là một đối tượng 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

ERB#result_with_hash

Đoạn mã sau đây chỉ ra cách gán các biến cục bộ cho mẫu ERB 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 2.5, bạn có thể viết lại với ERB # result_with_hash như sau:

require 'erb'
 
template = 'Result: <%= a * b %>'
ERB.new(template).result_with_hash(a: 2, b: 3) #=> "Result: 6"

rescue/else/ensure được đặt trong khối do/end mà không cần begin/end

bạn có thể viết nó như thế này:

[1].each do |n|
  n / 0
rescue
  # rescue
else
  # else
ensure
  # ensure
end

nhưng bạn sẽ nhận được lỗi nếu đặt nó trong {}:

[1].each { |n|
  n / 0
rescue
  # rescue
else
  # else
ensure
  # ensure
}
#=> SyntaxError: (irb):3: syntax error, unexpected keyword_rescue, expecting '}'
#     rescue
#     ^~~~~~

tôi sẽ còn cập nhập thêm những cái mới trong lần sau. 😃 một số tài liệu tham khảo: Feature #12733: Bundle bundler to ruby core Feature #13583: Adding Hash#transform_keys method Feature #11302: Dir.entries and Dir.foreach without [“.”, “..”]


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí