mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Add support for Object#in? and Object#either? in Active Support [#6321 state:committed]
This will allow you to check if an object is included in another object or the list of objects or not. This patch is derived from patch by Brian Morearty and John Reitano on Lighthouse ticket. I've rewrite it and make sure that we support both 'another object' and 'list of objects' version, as it surely be useful to support both.
This commit is contained in:
parent
62b2755f7a
commit
635d991683
3 changed files with 74 additions and 0 deletions
|
@ -1,5 +1,7 @@
|
|||
*Rails 3.1.0 (unreleased)*
|
||||
|
||||
* Add Object#in? to test if an object is included in another object, and Object#either? to test if an object is included in a list of objects which will be passed as arguments. [Prem Sichanugrist, Brian Morearty, John Reitano]
|
||||
|
||||
* LocalCache strategy is now a real middleware class, not an anonymous class
|
||||
posing for pictures.
|
||||
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
class Object
|
||||
# Returns true if this object is included in the argument. Argument must be
|
||||
# any object which respond to +#include?+. Usage:
|
||||
#
|
||||
# characters = ["Konata", "Kagami", "Tsukasa"]
|
||||
# "Konata".in?(characters) # => true
|
||||
#
|
||||
def in?(another_object)
|
||||
another_object.include?(self)
|
||||
end
|
||||
|
||||
# Returns true if this object is included in the argument list. Usage:
|
||||
#
|
||||
# username = "sikachu"
|
||||
# username.either?("josevalim", "dhh", "wycats") # => false
|
||||
#
|
||||
def either?(*objects)
|
||||
objects.include?(self)
|
||||
end
|
||||
end
|
52
activesupport/test/core_ext/object/inclusion_test.rb
Normal file
52
activesupport/test/core_ext/object/inclusion_test.rb
Normal file
|
@ -0,0 +1,52 @@
|
|||
require 'abstract_unit'
|
||||
require 'active_support/core_ext/object/inclusion'
|
||||
|
||||
class InTest < Test::Unit::TestCase
|
||||
def test_in_array
|
||||
assert 1.in?([1,2])
|
||||
assert !3.in?([1,2])
|
||||
end
|
||||
|
||||
def test_in_hash
|
||||
h = { "a" => 100, "b" => 200 }
|
||||
assert "a".in?(h)
|
||||
assert !"z".in?(h)
|
||||
end
|
||||
|
||||
def test_in_string
|
||||
assert "lo".in?("hello")
|
||||
assert !"ol".in?("hello")
|
||||
assert ?h.in?("hello")
|
||||
end
|
||||
|
||||
def test_in_range
|
||||
assert 25.in?(1..50)
|
||||
assert !75.in?(1..50)
|
||||
end
|
||||
|
||||
def test_in_set
|
||||
s = Set.new([1,2])
|
||||
assert 1.in?(s)
|
||||
assert !3.in?(s)
|
||||
end
|
||||
|
||||
def test_either
|
||||
assert 1.either?(1,2,3)
|
||||
assert !5.either?(1,2,3)
|
||||
assert [1,2,3].either?([1,2,3], 2, [3,4,5])
|
||||
end
|
||||
|
||||
module A
|
||||
end
|
||||
class B
|
||||
include A
|
||||
end
|
||||
class C < B
|
||||
end
|
||||
|
||||
def test_in_module
|
||||
assert A.in?(B)
|
||||
assert A.in?(C)
|
||||
assert !A.in?(A)
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue