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

ssc*_*rth 9 ruby arrays string

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

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

list(['a', 'b'])
Run Code Online (Sandbox Code Playgroud)

但是,作为使用仅由单个String元素组成的Array调用它的简写,我希望同样的函数也接受单个普通的String

  list('a')
Run Code Online (Sandbox Code Playgroud)

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

eng*_*nky 5

为什么不是这样的:

def list(*projects)
  projects.join(', ')
end
Run Code Online (Sandbox Code Playgroud)

然后你可以随意调用它

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"
Run Code Online (Sandbox Code Playgroud)

splat(*)会自动将所有参数转换为数组,这将允许您毫无问题地传递数组和/或字符串.它也适用于其他对象

list(1,2,'three',arr,{"test" => "hash"}) 
#=> "1, 2, three, a, b, c, d, e, f, g, {\"test\"=>\"hash\"}"
Run Code Online (Sandbox Code Playgroud)

谢谢@Stefan和@WandMaker指出Array#join可以处理嵌套的数组

  • @engineersmnky我很抱歉你是亲自接受的.如果您在搜索信息时遇到我的一个答案并发现它以错误的方向引导您,请务必发表评论和downvote. (12认同)
  • _这将允许您在没有问题的情况下传递数组和/或字符串 - 我不认为这是严格正确的.它的工作原理是因为`join`处理嵌套数组,但考虑像`def count_args(*p); P.SIZE; end` -`count_args(*arr)`将返回7,但`count_args(arr)`将返回1.调用者仍然需要知道splat数组. (4认同)
  • 你甚至不必将数组splat成参数. (2认同)