2013-10-14 2 views
1

Я хочу, чтобы передать блок в функцию, а затем вызвать этот блок с некоторыми дополнительными параметрами следующим образом:параметров Pass переданного в блоке в Рубине

def foo(&block) 
    some_array = (1..3).to_a 
    x = 7 # Simplified 
    result = some_array.map &block # Need some way to pass in 'x' here 
end 

def a_usage_that_works 
    foo do |value| 
    value 
    end 
end 

def a_usage_that_doesnt_work 
    foo do |value, x| 
    x # How do I pass in x? 
    end 
end 

# rspec to demonstrate problem/required result 
describe "spike" do 
    it "works" do 
    a_usage_that_works.should == [1,2,3] 
    end 
    it "doesn't work" do 
    a_usage_that_doesnt_work.should == [7, 7, 7] 
    end 
end 

Как я могу передать в дополнительном параметре к блок?

ответ

2

Создайте еще один блок и вызовите сначала его.

def foo(&block) 
    some_array = (1..3).to_a 
    x = 7 # Simplified 
    result = some_array.map {|elem| block.call(elem, x)} 
end 
1

Вы передаете блок, уступив ему.

def foo(&block) 
    some_array = [1,2,3] 
    x = 7 
    some_array.map{|el| yield el, x} 
end 

p foo{|p1, p2| p2} #=>[7,7,7] 
p foo{|p1, p2| p1} #=>[1,2,3] 
+0

Это не проходит испытания. Он отбрасывает значения из 'some_array'. – Stefan

+0

@Stefan (Код изменен) Это то, что вы хотите? – steenslag

+0

Да, это так. – Stefan

0

Вы можете использовать higher-order function для создания упрощенной функции:

Давайте предположим, что блок мы переходим к foo будет принимать value, x.

Наивные стратегии, используя встроенный определенный x:

def foo(&block) 
    some_array = (1..3).to_a 
    x = 7 
    simple_func = proc {|value| block.call(value, x) } 
    result = some_array.map &simple_func 
end 

стратегии, используя разделение задач:

def get_simple_func(block) 
    # This assumes x won't change per iteration. 
    # If it can change, you can move the calculation inside the proc. 
    # Moving it inside also allows the calculation to depend on "value", in case you want that. 
    x = complex_calculation_for_x() 
    proc {|value| block.call(value, x) } 
end 

def foo(&block) 
    some_array = (1..3).to_a 
    simple_func = get_simple_func(block) 
    result = some_array.map &simple_func 
end 

Очевидно, что вы не должны использовать это, когда x является буквенное значение, потому что это было бы быть чрезмерным. Но по мере усложнения вычисления x его разделение делает код более читаемым. Кроме того, foo может сосредоточиться на конкретной задаче применения функции до some_array.

Смежные вопросы