Commit 2fb12bd9 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #3034 from takahashim/try_convert

add {Array|Hash|String}.try_convert
parents 625a3fee 621487a0
class Array
##
# call-seq:
# Array.try_convert(obj) -> array or nil
#
# Tries to convert +obj+ into an array, using +to_ary+ method.
# converted array or +nil+ if +obj+ cannot be converted for any reason.
# This method can be used to check if an argument is an array.
#
# Array.try_convert([1]) #=> [1]
# Array.try_convert("1") #=> nil
#
# if tmp = Array.try_convert(arg)
# # the argument is an array
# elsif tmp = String.try_convert(arg)
# # the argument is a string
# end
#
def self.try_convert(obj)
if obj.respond_to?(:to_ary)
obj.to_ary
else
nil
end
end
##
# call-seq:
# ary.uniq! -> ary or nil
......@@ -709,4 +734,14 @@ class Array
end
nil
end
##
# call-seq:
# ary.to_ary -> ary
#
# Returns +self+.
#
def to_ary
self
end
end
##
# Array(Ext) Test
assert("Array.try_convert") do
assert_nil Array.try_convert(0)
assert_nil Array.try_convert(nil)
assert_equal [], Array.try_convert([])
assert_equal [1,2,3], Array.try_convert([1,2,3])
end
assert("Array#assoc") do
s1 = [ "colors", "red", "blue", "green" ]
s2 = [ "letters", "a", "b", "c" ]
......@@ -298,3 +305,8 @@ assert("Array#index (block)") do
assert_nil (1..10).to_a.index { |i| i % 5 == 0 and i % 7 == 0 }
assert_equal 34, (1..100).to_a.index { |i| i % 5 == 0 and i % 7 == 0 }
end
assert("Array#to_ary") do
assert_equal [], [].to_ary
assert_equal [1,2,3], [1,2,3].to_ary
end
......@@ -60,6 +60,25 @@ class Hash
h
end
##
# call-seq:
# Hash.try_convert(obj) -> hash or nil
#
# Try to convert <i>obj</i> into a hash, using to_hash method.
# Returns converted hash or nil if <i>obj</i> cannot be converted
# for any reason.
#
# Hash.try_convert({1=>2}) # => {1=>2}
# Hash.try_convert("1=>2") # => nil
#
def self.try_convert(obj)
if obj.respond_to?(:to_hash)
obj.to_hash
else
nil
end
end
##
# call-seq:
# hsh.merge!(other_hash) -> hsh
......
......@@ -39,6 +39,12 @@ assert('Hash.[] "c_key", "c_value"') do
end
end
assert('Hash.try_convert') do
assert_nil Hash.try_convert(nil)
assert_nil Hash.try_convert("{1=>2}")
assert_equal({1=>2}, Hash.try_convert({1=>2}))
end
assert('Hash#merge!') do
a = { 'abc_key' => 'abc_value', 'cba_key' => 'cba_value' }
b = { 'cba_key' => 'XXX', 'xyz_key' => 'xyz_value' }
......
class String
##
# call-seq:
# String.try_convert(obj) -> string or nil
#
# Try to convert <i>obj</i> into a String, using to_str method.
# Returns converted string or nil if <i>obj</i> cannot be converted
# for any reason.
#
# String.try_convert("str") #=> "str"
# String.try_convert(/re/) #=> nil
#
def self.try_convert(obj)
if obj.respond_to?(:to_str)
obj.to_str
else
nil
end
end
##
# call-seq:
# string.clear -> string
......
......@@ -3,6 +3,13 @@
UTF8STRING = ("\343\201\202".size == 1)
assert('String.try_convert') do
assert_nil String.try_convert(nil)
assert_nil String.try_convert(:foo)
assert_equal "", String.try_convert("")
assert_equal "1,2,3", String.try_convert("1,2,3")
end
assert('String#getbyte') do
str1 = "hello"
bytes1 = [104, 101, 108, 108, 111]
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment