Как я могу программно передать аргументы в Ruby?

Как передать переменное число аргументов в доходность. Я не хочу передавать массив (как это делает следующий код), я бы действительно хотел передать их как программное число аргументов в блок.

def each_with_attributes(attributes, &block)
  results[:matches].each_with_index do |match, index|
    yield self[index], attributes.collect { |attribute| (match[:attributes][attribute] || match[:attributes]["@#{attribute}"]) }
  end
end

Ответ 1

Используйте splat-operator *, чтобы преобразовать массив в аргументы.

block.call(*array)

или

yield *array

Ответ 2

Используйте звездочку, чтобы развернуть массив в свои отдельные компоненты в списке аргументов:

def print_num_args(*a)
  puts a.size
end

array = [1, 2, 3]
print_num_args(array);
print_num_args(*array);

Будет напечатан:

1
3

В первом случае передается массив, во втором случае каждый элемент передается отдельно. Обратите внимание, что вызываемая функция должна обрабатывать переменные аргументы, такие как print_num_args, если она ожидает список аргументов фиксированного размера и получает больше или меньше ожидаемого, вы получите исключение.

Ответ 3

Asterisk будет расширять массив до отдельных аргументов в ruby:

def test(a, b)
  puts "#{a} + #{b} = #{a + b}"
end

args = [1, 2]

test *args