Функция Ruby с неограниченным количеством параметров

Как создать функцию Ruby, которая не имеет явного количества параметров?

Необходимы дополнительные разъяснения?

Ответы

Ответ 1

Используйте *rest. здесь хороший маленький учебник.

Ответ 2

Используйте оператор 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

Ответ 3

(Если бы я мог добавить комментарий к принятому ответу, я бы сделал, но у меня недостаточно очков.)

Предупреждение: будьте осторожны с этим для методов обработки общих данных. Это отличный кусок синтаксического сахара, но есть ограничения на количество аргументов, которые вы можете передать методу, прежде чем вы получите SystemStackError. Я использовал этот предел, используя redis.mapped_mget *keys. Кроме того, предел изменится в зависимости от того, где вы используете оператор splat. Например, если запустить локальную локальную сеть, я могу использовать массивы из более чем 130 000 элементов для метода. Однако, действуя в рамках целлулоидного актера, этот предел может составлять менее 16 000 элементов.

Ответ 5

Кроме того, здесь также есть интересная техника "двойника" для передачи нескольких именованных параметров. Он основан на том факте, что 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.)