Vous voulez un proc objet:
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
Il suffit de noter que vous ne pouvez pas définir un argument par défaut dans un bloc de déclaration comme ça. Si vous avez besoin d'utiliser un splat et la configuration par défaut dans le proc code lui-même.
Ou, selon votre portée de tout cela, il peut être plus facile à passer dans un nom de méthode à la place.
def weightedknn(data, vec1, k = 5, weightf = :gaussian)
...
weight = self.send(weightf)
...
end
Dans ce cas, vous êtes juste à l'appel d'une méthode est définie sur un objet plutôt que de passer dans un bloc de code. Selon la façon dont vous structurez cela, vous pouvez avoir besoin de remplacer self.send
avec object_that_has_the_these_math_methods.send
Dernier mais non le moindre, vous pouvez accrocher un pâté de maisons de la méthode.
def weightedknn(data, vec1, k = 5)
...
weight =
if block_given?
yield(dist)
else
gaussian.call(dist)
end
end
...
end
wegihtedknn(foo, bar) do |dist|
# square the dist
dist * dist
end
Mais il semble que vous désirez de plus réutilisable morceaux de code ici.