Quieres un objeto 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
Solo tenga en cuenta que no puede establecer un argumento predeterminado en una declaración de bloque como esa. Por lo tanto, debe usar un símbolo y configurar el valor predeterminado en el código de proceso.
O, dependiendo del alcance de todo esto, puede ser más fácil pasar un nombre de método en su lugar.
def weightedknn(data, vec1, k = 5, weightf = :gaussian)
...
weight = self.send(weightf)
...
end
En este caso, solo está llamando a un método que está definido en un objeto en lugar de pasar un fragmento completo de código. Dependiendo de cómo lo estructura, es posible que deba reemplazarlo self.send
conobject_that_has_the_these_math_methods.send
Por último, pero no menos importante, puede colgar un bloque del método.
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
Pero parece que le gustaría tener más fragmentos de código reutilizables aquí.