あなたはprocオブジェクトが欲しい:
gaussian = Proc.new do |dist, *args|
sigma = args.first || 10.0
...
end
def weightedknn(data, vec1, k = 5, weightf = gaussian)
...
weight = weightf.call(dist)
...
end
このようなブロック宣言では、デフォルトの引数を設定できないことに注意してください。したがって、スプラットを使用し、procコード自体にデフォルトを設定する必要があります。
または、これらすべてのスコープによっては、代わりにメソッド名を渡す方が簡単な場合があります。
def weightedknn(data, vec1, k = 5, weightf = :gaussian)
...
weight = self.send(weightf)
...
end
この場合、コードの完全なチャンクを渡すのではなく、オブジェクトで定義されているメソッドを呼び出すだけです。これをどのように構成するかに応じて、次のものself.send
と置き換える必要がありますobject_that_has_the_these_math_methods.send
最後に重要なことですが、メソッドからブロックを掛けることができます。
def weightedknn(data, vec1, k = 5)
...
weight =
if block_given?
yield(dist)
else
gaussian.call(dist)
end
end
...
end
weightedknn(foo, bar) do |dist|
# square the dist
dist * dist
end
しかし、ここでは再利用可能なコードのチャンクがもっと必要なようです。