1

ブロックを関数に渡し、次のようにいくつかの追加パラメーターを指定してそのブロックを呼び出します。

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

追加のパラメーターをブロックに渡すにはどうすればよいですか?

4

3 に答える 3

2

別のブロックを作成し、そこから最初のブロックを呼び出します。

def foo(&block)
  some_array = (1..3).to_a
  x = 7 # Simplified
  result = some_array.map {|elem| block.call(elem, x)}
end
于 2013-10-14T12:40:08.027 に答える
0

高階関数を使用して単純化された関数を生成できます。

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

于 2013-10-14T16:59:46.737 に答える