Vuoi un oggetto 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
Tieni presente che non puoi impostare un argomento predefinito in una dichiarazione di blocco come quella. Quindi è necessario utilizzare uno splat e impostare il valore predefinito nel codice proc stesso.
Oppure, a seconda della portata di tutto ciò, potrebbe essere più semplice passare invece un nome di metodo.
def weightedknn(data, vec1, k = 5, weightf = :gaussian)
...
weight = self.send(weightf)
...
end
In questo caso stai solo chiamando un metodo definito su un oggetto invece di passare una porzione completa di codice. A seconda di come lo strutturi potresti dover sostituire self.send
conobject_that_has_the_these_math_methods.send
Ultimo ma non meno importante, puoi appendere un blocco al metodo.
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
Ma sembra che tu voglia più blocchi di codice riutilizzabili qui.