Вам нужен объект 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
Просто обратите внимание, что вы не можете установить аргумент по умолчанию в таком объявлении блока. Поэтому вам нужно использовать знак и установить значение по умолчанию в самом коде процедуры.
Или, в зависимости от вашего объема всего этого, может быть проще передать вместо этого имя метода.
def weightedknn(data, vec1, k = 5, weightf = :gaussian)
...
weight = self.send(weightf)
...
end
В этом случае вы просто вызываете метод, определенный для объекта, а не передаете полный фрагмент кода. В зависимости от того, как вы это структурируете, вам может потребоваться заменить self.send
наobject_that_has_the_these_math_methods.send
И последнее, но не менее важное: вы можете повесить блок на метод.
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
Но похоже, что вы хотели бы здесь больше многоразовых фрагментов кода.