我定义了一个采用数组(字符串)的方法,比如
def list(projects)
puts projects.join(', ')
end
list(['a', 'b'])
但是,作为一个只用一个String元素组成的Array来调用它的简写,我希望同样的函数也接受一个像
这样的普通字符串 list('a')
在方法中处理这个问题的Ruby方法是什么?
答案 0 :(得分:5)
为什么不这样:
def list(*projects)
projects.join(', ')
end
然后你可以用尽可能多的参数来调用它
list('a')
#=> "a"
list('a','b')
#=> "a, b"
arr = %w(a b c d e f g)
list(*arr)
#=> "a, b, c, d, e, f, g"
list(arr,'h','i')
#=> "a, b, c, d, e, f, g, h, i"
splat(*)会自动将所有参数转换为数组,这样您就可以毫无问题地传递数组和/或字符串。它也适用于其他对象
list(1,2,'three',arr,{"test" => "hash"})
#=> "1, 2, three, a, b, c, d, e, f, g, {\"test\"=>\"hash\"}"
谢谢@Stefan和@WandMaker指出Array#join
可以处理嵌套数组
功能
答案 1 :(得分:4)
您可以检查输入的类型,例如:
>> a = ['foo', 'bar']
=> ['foo', 'bar']
>> a.is_a? Array
=> true
您还可以使用is_a?
你最终会得到一些链接:
def list(projects)
if projects.is_a? Array
puts projects.join(', ')
else
puts projects
end
end
list('a') # a
list(['a', 'b']) # a, b
您可以通过多种方式在Ruby中执行此操作,respond_to?
和kind_of?
也可以使用
答案 2 :(得分:2)
def list(projects)
puts Array(projects).join(', ')
end
list ['a', 'b']
a, b
list 'a'
a
也可以写
puts [*projects].join(', ')
警告:不要使用它。
我发布此解决方案只是为了展示两种方法。 @sawa,在他现在删除的答案中是正确的:不应该允许该方法的用户将数组作为参数传递。相反,它们应限于传递单个元素。如果:
arr = [1,2,3]
该方法将由以下之一调用:
list 1
list 1,2
list 1,2,3
list *arr
但不是:
list arr
这简化了方法并使其应用更加一致。问问自己:为什么允许arr
代替*arr
?保存一个角色?
执行此操作的方法是删除.flatten
的@ engineersmnky答案。
答案 3 :(得分:1)
一种方法是你可以输入检查输入:
def list(projects)
if projects.is_a?(String)
projects = [projects]
end
puts projects.join(', ')
end
或者您可以使用Array()
将字符串自动转换为数组,或者仅保留现有数组:
def list(projects)
Array(projects).join(', ')
end
答案 4 :(得分:1)
如果它响应join
:
def list(projects)
projects.respond_to?(:join) ? projects.join(', ') : projects
end