Você quer um 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
Apenas observe que você não pode definir um argumento padrão em uma declaração de bloco como essa. Portanto, você precisa usar um splat e configurar o padrão no próprio código proc.
Ou, dependendo do escopo de tudo isso, pode ser mais fácil passar um nome de método.
def weightedknn(data, vec1, k = 5, weightf = :gaussian)
...
weight = self.send(weightf)
...
end
Nesse caso, você está apenas chamando um método definido em um objeto, em vez de passar um pedaço completo de código. Dependendo de como você estrutura isso, você pode precisar substituir self.send
porobject_that_has_the_these_math_methods.send
Por último, mas não menos importante, você pode suspender um bloco do 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
Mas parece que você gostaria de pedaços de código mais reutilizáveis aqui.