Rubyでメソッドをパラメータとして渡す

概要

私は Ruby を学ぼうとしており、書籍「Programming Collective Intelligence」に記載されている Python アルゴリズムを Ruby で実装したいと考えています。

第 8 章で、著者は Python では機能するように見えるメソッドをパラメータとして渡しましたが、Ruby では機能しませんでした。

私は次の方法を使用しています:

def gaussian(dist, sigma=10.0)
  foo
end

別のメソッドを使用してこれを呼び出したいとします。

def weightedknn(data, vec1, k = 5, weightf = gaussian)
  foo
  weight = weightf(dist)
  foo
end

しかし、エラーが発生しました:

ArgumentError: wrong number of arguments (0 for 1)

解決策

ブロックと Proc について言及しているコメントは、Ruby ではより一般的であるという点で正しいです。ただし、必要に応じてメソッドを渡すこともできます。 Method を呼び出してメソッドを取得し、 .call を呼び出してそれを呼び出します。

def weightedknn( data, vec1, k = 5, weightf = method(:gaussian) )
  ...
  weight = weightf.call( dist )
  ...
end