簡體   English   中英

將參數傳遞給Ruby中的傳入塊

[英]Pass parameters to passed-in block in Ruby

我想將一個塊傳遞給一個函數,然后用一些額外的參數調用該塊,如下所示:

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

如何將附加參數傳遞給塊?

創建另一個塊並從中調用第一個塊。

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

你通過屈服於它來傳遞給該區塊。

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]

您可以使用高階函數生成簡化函數:

讓我們假設我們傳遞給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的特定任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM