1
0
Fork 0
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:
Prem Sichanugrist, Brian Morearty, John Reitano 2011-04-10 20:27:08 +08:00 committed by David Heinemeier Hansson
parent 62b2755f7a
commit 635d991683
3 changed files with 74 additions and 0 deletions

View file

@ -1,5 +1,7 @@
*Rails 3.1.0 (unreleased)* *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 * LocalCache strategy is now a real middleware class, not an anonymous class
posing for pictures. posing for pictures.

View file

@ -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

View 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