提交 575dbeee 编写于 作者: X Xavier Noria

define Range#match? if Ruby < 2.4

See the rationale in the documentation included in this patch.

We are going to gradually introduce this predicate in the code base.
上级 d4ea18a8
* Defines `Regexp.match?` for Ruby versions prior to 2.4. The predicate
has the same interface, but it does not have the performance boost. It's
purpose is to be able to write 2.4 compatible code.
*Xavier Noria*
* Allow MessageEncryptor to take advantage of authenticated encryption modes.
AEAD modes like `aes-256-gcm` provide both confidentiality and data
......
......@@ -2,4 +2,8 @@ class Regexp #:nodoc:
def multiline?
options & MULTILINE == MULTILINE
end
def match?(string, pos=0)
!! match(string, pos)
end unless //.respond_to?(:match?)
end
......@@ -7,4 +7,28 @@ def test_multiline
assert_equal false, //.multiline?
assert_equal false, /(?m:)/.multiline?
end
# Based on https://github.com/ruby/ruby/blob/trunk/test/ruby/test_regexp.rb.
def test_match_p
/back(...)/ =~ 'backref'
# must match here, but not in a separate method, e.g., assert_send,
# to check if $~ is affected or not.
assert_equal false, //.match?(nil)
assert_equal true, //.match?("")
assert_equal true, /.../.match?(:abc)
assert_raise(TypeError) { /.../.match?(Object.new) }
assert_equal true, /b/.match?('abc')
assert_equal true, /b/.match?('abc', 1)
assert_equal true, /../.match?('abc', 1)
assert_equal true, /../.match?('abc', -2)
assert_equal false, /../.match?("abc", -4)
assert_equal false, /../.match?("abc", 4)
assert_equal true, /\z/.match?("")
assert_equal true, /\z/.match?("abc")
assert_equal true, /R.../.match?("Ruby")
assert_equal false, /R.../.match?("Ruby", 1)
assert_equal false, /P.../.match?("Ruby")
assert_equal 'backref', $&
assert_equal 'ref', $1
end
end
......@@ -2916,6 +2916,24 @@ end
NOTE: Defined in `active_support/core_ext/regexp.rb`.
### `match?`
Rails implements `Regexp#match?` for Ruby versions prior to 2.4:
```ruby
/oo/.match?('foo') # => true
/oo/.match?('bar') # => false
/oo/.match?('foo', 1) # => true
```
The backport has the same interface and lack of side-effects in the caller like
not setting `$1` and friends, but it does not have the speed benefits. Its
purpose is to be able to write 2.4 compatible code. Rails itself uses this
predicate internally for example.
Active Support defines `Regexp#match?` only if not present, so code running
under 2.4 or later does run the original one and gets the performance boost.
Extensions to `Range`
---------------------
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册