Chcesz obiekt 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
Zwróć uwagę, że nie możesz ustawić domyślnego argumentu w takiej deklaracji bloku. Musisz więc użyć ikony i ustawić wartość domyślną w samym kodzie proc.
Lub, w zależności od zakresu tego wszystkiego, łatwiej będzie zamiast tego przekazać nazwę metody.
def weightedknn(data, vec1, k = 5, weightf = :gaussian)
...
weight = self.send(weightf)
...
end
W tym przypadku po prostu wywołujesz metodę, która jest zdefiniowana na obiekcie, zamiast przekazywać cały fragment kodu. W zależności od tego, jak zorganizować to może trzeba wymienić self.send
zobject_that_has_the_these_math_methods.send
Wreszcie, możesz zawiesić blok na metodzie.
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
Ale wygląda na to, że chciałbyś mieć więcej fragmentów kodu wielokrotnego użytku tutaj.