Anda menginginkan objek 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
Perhatikan saja bahwa Anda tidak dapat menyetel argumen default dalam deklarasi blok seperti itu. Jadi Anda perlu menggunakan percikan dan mengatur default di kode proc itu sendiri.
Atau, bergantung pada cakupan semua ini, mungkin lebih mudah untuk meneruskan nama metode sebagai gantinya.
def weightedknn(data, vec1, k = 5, weightf = :gaussian)
...
weight = self.send(weightf)
...
end
Dalam hal ini Anda hanya memanggil metode yang didefinisikan pada sebuah objek daripada mengirimkan potongan kode lengkap. Tergantung pada bagaimana Anda menyusun ini, Anda mungkin perlu mengganti self.senddenganobject_that_has_the_these_math_methods.send
Last but not least, Anda dapat menggantung satu blok dari metode ini.
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
Tapi sepertinya Anda ingin potongan kode yang lebih dapat digunakan kembali di sini.