12/08/2018, 15:39

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.

0