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ờ ...
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.