Ответ 1
Используйте splat-operator *
, чтобы преобразовать массив в аргументы.
block.call(*array)
или
yield *array
Как передать переменное число аргументов в доходность. Я не хочу передавать массив (как это делает следующий код), я бы действительно хотел передать их как программное число аргументов в блок.
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
Используйте splat-operator *
, чтобы преобразовать массив в аргументы.
block.call(*array)
или
yield *array
Используйте звездочку, чтобы развернуть массив в свои отдельные компоненты в списке аргументов:
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, если она ожидает список аргументов фиксированного размера и получает больше или меньше ожидаемого, вы получите исключение.
Asterisk будет расширять массив до отдельных аргументов в ruby:
def test(a, b)
puts "#{a} + #{b} = #{a + b}"
end
args = [1, 2]
test *args