New features in Ruby 2.4
Trong Ruby, phương thức IPAddr # == được sử dụng để kiểm tra xem hai địa chỉ IP có bằng hay không. Ruby cũng có phương pháp IPAddr # <=> được sử dụng để so sánh hai địa chỉ IP. Trong Ruby 2.3, hành vi của các phương pháp này là không nhất quán. Hãy xem ví dụ. # Ruby 2.3 >> ...
Trong Ruby, phương thức IPAddr # == được sử dụng để kiểm tra xem hai địa chỉ IP có bằng hay không. Ruby cũng có phương pháp IPAddr # <=> được sử dụng để so sánh hai địa chỉ IP.
Trong Ruby 2.3, hành vi của các phương pháp này là không nhất quán. Hãy xem ví dụ.
# Ruby 2.3 >> IPAddr.new("1.2.1.3") == "Some ip address" => IPAddr::InvalidAddressError: invalid address
Nhưng nếu đối số đầu tiên là địa chỉ IP không hợp lệ và thứ hai là địa chỉ IP hợp lệ, thì nó sẽ trả về false. Phương pháp <=> sẽ đưa ra ngoại lệ trong cả hai trường hợp.
# Ruby 2.3 >> "Some ip address" <=> IPAddr.new("1.2.1.3") => IPAddr::InvalidAddressError: invalid address >> IPAddr.new("1.2.1.3") <=> "Some ip address" => IPAddr::InvalidAddressError: invalid address
Trong Ruby 2.4, vấn đề này là cố định cho cả hai phương thức để trả lại kết quả mà không bắn ra ngoại lệ, nếu các đối tượng được so sánh không thể được chuyển đổi sang một đối tượng IPAddr.
# Ruby 2.4 >> IPAddr.new("1.2.1.3") == "Some ip address" => false >> "Some ip address" == IPAddr.new("1.2.1.3") => false >> IPAddr.new("1.2.1.3") <=> "Some ip address" => nil >> "Some ip address" <=> IPAddr.new("1.2.1.3") => nil
Điều này có thể gây ra một số tương thích ngược nếu mã của chúng tôi là mong đợi ngoại lệ không còn được nêu ra trong Ruby 2.4
Ruby có các hằng số cao nhất như TRUE, FALSE và NIL. Những hằng số này chỉ là những từ đồng nghĩa đúng, sai và không hợp lệ.
Trong Ruby 2.4, các hằng này không được dùng nữa và sẽ được gỡ bỏ trong phiên bản tương lai.
# Ruby 2.3 2.3.1 :001 > TRUE => true 2.3.1 :002 > FALSE => false 2.3.1 :003 > NIL => nil `` Ruby 2.4
2.4.0 :001 > TRUE (irb):1: warning: constant ::TRUE is deprecated => true 2.4.0 :002 > FALSE (irb):2: warning: constant ::FALSE is deprecated => false 2.4.0 :003 > NIL (irb):3: warning: constant ::NIL is deprecated => nil
Trong Ruby, có nhiều phương thức sẵn có giúp chúng ta sửa đổi một giá trị float hoặc integer.
Ruby 2.3.x
Trong các phiên bản trước của Ruby, chúng ta có thể sử dụng các phương thức như floor, ceil và truncate theo các cách sau.
5.54.floor #=> 5 5.54.ceil #=> 6 5.54.truncate #=> 5
Ruby 2.4
Cộng đồng Ruby đã quyết định đưa ra một lựa chọn để thêm các tham số chính xác. Tham số chính xác, có thể âm, giúp chúng ta đạt được kết quả theo độ chính xác yêu cầu cho cả hai mặt của điểm thập phân. Giá trị mặc định cho tham số chính xác là 0.
876.543.floor(-2) #=> 800 876.543.floor(-1) #=> 870 876.543.floor #=> 876 876.543.floor(1) #=> 876.5 876.543.floor(2) #=> 876.54 876.543.ceil(-2) #=> 900 876.543.ceil(-1) #=> 880 876.543.ceil #=> 877 876.543.ceil(1) #=> 876.6 876.543.ceil(2) #=> 876.55 876.543.truncate(-2) #=> 800 876.543.truncate(-1) #=> 870 876.543.truncate #=> 876 876.543.truncate(1) #=> 876.5 876.543.truncate(2) #=> 876.54
Tất cả các phương thức này đều làm việc giống nhau trên Integer.
5.floor(2) #=> 5.0 5.ceil(2) #=> 5.0 5.truncate(2) #=> 5.0
Xem xét các tập tin sau đây cần phải được đọc trong Ruby. Chúng ta có thể sử dụng phương pháp IO # readlines để lấy các dòng trong một mảng.
# test.txt Three Rings for the Elven-kings under the sky, Seven for the Dwarf-lords in their halls of stone, Nine for Mortal Men doomed to die, One for the Dark Lord on his dark throne In the Land of Mordor where the Shadows lie.
Ruby 2.3
IO.readlines('test.txt') #=> ["Three Rings for the Elven-kings under the sky, ", "Seven for the Dwarf-lords in their halls of stone, ", "Nine for Mortal Men doomed to die, ", "One for the Dark Lord on his dark throne ", "In the Land of Mordor where the Shadows lie."]
Như chúng ta có thể thấy, các dòng trong mảng có n, ký tự dòng mới, không bị bỏ qua khi đọc các dòng. Các ký tự dòng mới cần phải được cắt nhỏ trong hầu hết các trường hợp. Trước khi Ruby 2.4, nó có thể được thực hiện theo cách sau.
IO.readlines('test.txt').map(&:chomp) #=> ["Three Rings for the Elven-kings under the sky,", "Seven for the Dwarf-lords in their halls of stone,", "Nine for Mortal Men doomed to die,", "One for the Dark Lord on his dark throne", "In the Land of Mordor where the Shadows lie."]
Ruby 2.4
Bây giờ có thể đạt được điều tương tự trong Ruby 2.4 theo cách sau.
IO.readlines('test.txt', chomp: true) #=> ["Three Rings for the Elven-kings under the sky,", "Seven for the Dwarf-lords in their halls of stone,", "Nine for Mortal Men doomed to die,", "One for the Dark Lord on his dark throne", "In the Land of Mordor where the Shadows lie."]
Ngoài ra, IO # gets, IO # readline, IO # each_line, IO # foreach phương thức cũng đã được sửa đổi để chấp nhận một chomp tùy chọn.
Trong Ruby 2.3, nếu đối số để mở uri là http và host chuyển hướng đến https, thì open-uri sẽ ném một lỗi.
> require 'open-uri' > open('http://www.google.com/gmail') RuntimeError: redirection forbidden: http://www.google.com/gmail -> https://www.google.com/gmail/
Để giải quyết vấn đề này, chúng ta có thể sử dụng gem open_uri_redirections : https://github.com/open-uri-redirections/open_uri_redirections
> require 'open-uri' > require 'open_uri_redirections' > open('http://www.google.com/gmail/', :allow_redirections => :safe) => #<Tempfile:/var/folders/jv/fxkfk9_10nb_964rvrszs2540000gn/T/open-uri20170228-41042-2fffoa>
Trong Ruby 2.4, vấn đề này là cố định. Vì vậy, bây giờ http to https chuyển hướng có thể sử dụng mở-uri.
> require 'open-uri' > open('http://www.google.com/gmail') => #<Tempfile:/var/folders/jv/fxkfk9_10nb_964rvrszs2540000gn/T/open-uri20170228-41077-1bkm1dv>
Lưu ý rằng chuyển hướng từ https sang http sẽ gây ra lỗi.