2016-03-07 7 views
2

Мне нужно написать метод, который принимает неизвестное количество аргументов (следовательно, * splat), но которое передает спецификацию yields_with_args.Есть ли способ без (*) аргумента splat передать несколько аргументов в Ruby?

Код:

def eval_block(*args, &block) 
    raise "NO BLOCK GIVEN!" if block.nil? 
     block.call(args) 
end 

RSpec:

it "passes the arguments into the block" do 
     expect do |block| 
     eval_block(1, 2, 3, &block) 
     end.to yield_with_args(1, 2, 3) 
    end 
end 

Он работает, но он дает массив, * знак создает: [1,2,3] против 1,2,3, и, следовательно, не проходит RSpec. Есть ли другой способ передать несколько аргументов с помощью метода в Ruby?

ответ

6

Заменить

block.call(args) 

с

block.call(*args) 

Splat имеет две функции: сбор аргументов в массив, когда в определении, и распределяя массив для аргументов в вызовах. Эти два являются обратными операциями: если вы ожидаете прозрачной операции (три аргумента идут, выходят три аргумента), вы должны распространять собранные вами данные.

+1

Сохранение жизней, bruh –