Вы хотите объект 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
Но звучит так, как будто вы хотели бы больше кусков кода, которые можно использовать повторно.