未验证 提交 c7b83273 编写于 作者: R Ryuta Kamizono 提交者: GitHub

Merge pull request #31049 from gwincr11/cg-blank

Add support for multiple encodings in String.blank?
# frozen_string_literal: true # frozen_string_literal: true
require "active_support/core_ext/regexp" require "active_support/core_ext/regexp"
require "concurrent/map"
class Object class Object
# An object is blank if it's false, empty, or a whitespace string. # An object is blank if it's false, empty, or a whitespace string.
...@@ -102,6 +103,9 @@ class Hash ...@@ -102,6 +103,9 @@ class Hash
class String class String
BLANK_RE = /\A[[:space:]]*\z/ BLANK_RE = /\A[[:space:]]*\z/
ENCODED_BLANKS = Concurrent::Map.new do |h, enc|
h[enc] = Regexp.new(BLANK_RE.source.encode(enc), BLANK_RE.options | Regexp::FIXEDENCODING)
end
# A string is blank if it's empty or contains whitespaces only: # A string is blank if it's empty or contains whitespaces only:
# #
...@@ -119,7 +123,12 @@ def blank? ...@@ -119,7 +123,12 @@ def blank?
# The regexp that matches blank strings is expensive. For the case of empty # The regexp that matches blank strings is expensive. For the case of empty
# strings we can speed up this method (~3.5x) with an empty? call. The # strings we can speed up this method (~3.5x) with an empty? call. The
# penalty for the rest of strings is marginal. # penalty for the rest of strings is marginal.
empty? || BLANK_RE.match?(self) empty? ||
begin
BLANK_RE.match?(self)
rescue Encoding::CompatibilityError
ENCODED_BLANKS[self.encoding].match?(self)
end
end end
end end
......
...@@ -16,8 +16,8 @@ def empty? ...@@ -16,8 +16,8 @@ def empty?
end end
end end
BLANK = [ EmptyTrue.new, nil, false, "", " ", " \n\t \r ", " ", "\u00a0", [], {} ] BLANK = [ EmptyTrue.new, nil, false, "", " ", " \n\t \r ", " ", "\u00a0", [], {}, " ".encode("UTF-16LE")]
NOT = [ EmptyFalse.new, Object.new, true, 0, 1, "a", [nil], { nil => 0 }, Time.now ] NOT = [ EmptyFalse.new, Object.new, true, 0, 1, "a", [nil], { nil => 0 }, Time.now , "my value".encode("UTF-16LE")]
def test_blank def test_blank
BLANK.each { |v| assert_equal true, v.blank?, "#{v.inspect} should be blank" } BLANK.each { |v| assert_equal true, v.blank?, "#{v.inspect} should be blank" }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册