Лично я бы использовал переменные args:
def foo(*args)
args.each { |arg| puts arg }
end
foo("bar") # bar
foo("bar", "foobar") # bar \n foobar
foo(*%w(bar foobar)) # bar \n foobar
a = ["bar", "foobar"]
foo(*a) # bar \n foobar
foo("baz", *a) # baz \n bar \n foobar
a = "bar"
foo(*a) # bar
Если вы не знаете, является ли ваш аргумент строкой или массивом, просто добавьте к нему *
.
Я считаю, что это дает максимальную гибкость при работе с массивами, которые могут вместо этого быть одним значением, поскольку я могу вводить их в качестве аргументов, если я инициализирую массив или безопасно передам переменную, если я знаю, что это будет либо массив или единственный аргумент. Хотя он захлебнется хешами.