Vous voulez un objet 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
Notez simplement que vous ne pouvez pas définir d'argument par défaut dans une déclaration de bloc comme celle-ci. Vous devez donc utiliser un splat et configurer la valeur par défaut dans le code proc lui-même.
Ou, en fonction de votre portée de tout cela, il peut être plus facile de passer un nom de méthode à la place.
def weightedknn(data, vec1, k = 5, weightf = :gaussian)
...
weight = self.send(weightf)
...
end
Dans ce cas, vous appelez simplement une méthode qui est définie sur un objet plutôt que de passer un morceau complet de code. Selon la façon dont vous structurez cela , vous devrez peut - être remplacer self.send
parobject_that_has_the_these_math_methods.send
Dernier point mais non le moindre, vous pouvez suspendre un bloc de la méthode.
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
Mais il semble que vous aimeriez plus de morceaux de code réutilisables ici.