如何定义一个采用数组或字符串的Ruby方法?

时间:2015-07-29 15:00:26

标签: arrays ruby string

我定义了一个采用数组(字符串)的方法,比如

def list(projects)
  puts projects.join(', ')
end

list(['a', 'b'])

但是,作为一个只用一个String元素组成的Array来调用它的简写,我希望同样的函数也接受一个像

这样的普通字符串
  list('a')

在方法中处理这个问题的Ruby方法是什么?

5 个答案:

答案 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