提交 0020f1a4 编写于 作者: R Rafael França 提交者: GitHub

Merge pull request #25914 from jmccartie/jm/not_in

Adds `not_in?` onto Object
* Introduce `not_in?` on `Object`.
As an opposite method for `in?`, `not_in?` provides equivalent support for exclusion. This turns this:
[1,2].exclude?(user_id)
...into this:
user_id.not_in?([1,2])
*Jon McCartie*
* Defines `Regexp.match?` for Ruby versions prior to 2.4. The predicate
has the same interface, but it does not have the performance boost. Its
purpose is to be able to write 2.4 compatible code.
......
......@@ -4,6 +4,7 @@
require 'active_support/core_ext/object/deep_dup'
require 'active_support/core_ext/object/try'
require 'active_support/core_ext/object/inclusion'
require 'active_support/core_ext/object/exclusion'
require 'active_support/core_ext/object/conversions'
require 'active_support/core_ext/object/instance_variables'
......
class Object
# Returns true if this object is excluded in the argument. Argument must be
# any object which responds to +#include?+. Usage:
#
# characters = ["Konata", "Kagami", "Tsukasa"]
# "MoshiMoshi".not_in?(characters) # => true
#
# This will throw an +ArgumentError+ if the argument doesn't respond
# to +#include?+.
def not_in?(another_object)
!another_object.include?(self)
rescue NoMethodError
raise ArgumentError.new("The parameter passed to #not_in? must respond to #include?")
end
end
\ No newline at end of file
require 'abstract_unit'
require 'active_support/core_ext/object/exclusion'
class NotInTest < ActiveSupport::TestCase
def test_not_in_array
assert 1.not_in?([2, 3])
assert_not 2.not_in?([1,2])
end
def test_not_in_hash
h = { "a" => 100, "b" => 200 }
assert "z".not_in?(h)
assert_not "a".not_in?(h)
end
def test_not_in_string
assert "ol".not_in?("hello")
assert_not "lo".not_in?("hello")
assert ?z.not_in?("hello")
end
def test_not_in_range
assert 75.not_in?(1..50)
assert_not 25.not_in?(1..50)
end
def test_not_in_set
s = Set.new([1,2])
assert 3.not_in?(s)
assert_not 1.not_in?(s)
end
module A
end
class B
include A
end
class C < B
end
class D
end
def test_not_in_module
assert A.not_in?(D)
assert A.not_in?(A)
assert_not A.not_in?(B)
assert_not A.not_in?(C)
end
def test_no_method_catching
assert_raise(ArgumentError) { 1.not_in?(1) }
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册