Как я могу программно передать аргументы в yield в Ruby? - PullRequest
11 голосов
/ 29 ноября 2008

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

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

Ответы [ 3 ]

14 голосов
/ 29 ноября 2008

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

block.call(*array)

или

yield *array
3 голосов
/ 29 ноября 2008

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

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, если она ожидает список аргументов фиксированного размера и получает больше или меньше ожидаемого, вы получите исключение.

2 голосов
/ 29 ноября 2008

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

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

args = [1, 2]

test *args
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...