Как насчет их всех как Arrays
? Требуемое вами поведение для String
s такое же, как и для Array
, содержащего только это String
:
def foo(obj, arg)
[*arg].each { |method| obj.send(method) }
end
Трюк [*arg]
работает, потому что оператор splat (*
) превращает отдельный элемент в себя или Array
в встроенный список его элементов.
Позже
Это в основном просто синтаксически подслащенная версия или ответ Арно , хотя есть небольшие различия, если вы передаете Array
, содержащий другие Array
с.
Позже
Есть еще одна разница, связанная с возвращаемым значением foo
. Если вы позвоните foo(bar, :baz)
, вы можете быть удивлены, получив [baz]
обратно. Чтобы решить эту проблему, вы можете добавить Kestrel :
def foo(obj, arg)
returning(arg) do |args|
[*args].each { |method| obj.send(method) }
end
end
, который всегда будет возвращать arg
как пройдено. Или вы можете сделать returning(obj)
, чтобы вы могли связывать вызовы с foo
. Вам решать, какое поведение возвращаемого значения вы хотите.