Ответ 1
Используйте *rest
. здесь хороший маленький учебник.
Как создать функцию Ruby, которая не имеет явного количества параметров?
Необходимы дополнительные разъяснения?
Используйте *rest
. здесь хороший маленький учебник.
Используйте оператор splat *
def foo(a,b,c,*others)
# this function has at least three arguments,
# but might have more
puts a
puts b
puts c
puts others.join(',')
end
foo(1,2,3,4,5,6,7,8,9)
# prints:
# 1
# 2
# 3
# 4,5,6,7,8,9
(Если бы я мог добавить комментарий к принятому ответу, я бы сделал, но у меня недостаточно очков.)
Предупреждение: будьте осторожны с этим для методов обработки общих данных. Это отличный кусок синтаксического сахара, но есть ограничения на количество аргументов, которые вы можете передать методу, прежде чем вы получите SystemStackError. Я использовал этот предел, используя redis.mapped_mget *keys
. Кроме того, предел изменится в зависимости от того, где вы используете оператор splat. Например, если запустить локальную локальную сеть, я могу использовать массивы из более чем 130 000 элементов для метода. Однако, действуя в рамках целлулоидного актера, этот предел может составлять менее 16 000 элементов.
Вот еще одна статья по теме:
www.misuse.org/science/2008/01/30/passing-multiple-arguments-in-ruby-is-your-friend
Дает несколько хороших примеров, катящихся и разворачивающих ваши параметры с помощью "*"
Кроме того, здесь также есть интересная техника "двойника" для передачи нескольких именованных параметров. Он основан на том факте, что Ruby преобразует список именованных параметров в хеш, если он указан в месте, где ожидается один позиционный параметр:
def hashed_args_test(args = {})
p args
end
hashed_args_test(arg1: "val1", arg2: "val2")
# => {:arg1=>"val1", :arg2=>"val2"}
hashed_args_test( {arg1: "val1", arg2: "val2"} )
# => {:arg1=>"val1", :arg2=>"val2"}
Таким образом, оба способа вызова метода предоставляют хэш (любого количества) элементов - будь то использование синтаксиса хеша явно или что-то, что выглядит точно так же, как передача именованных параметров. (Проверено на Ruby 2.5.3.)