Ви хочете прок-об’єкт:
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
Просто зауважте, що ви не можете встановити аргумент за замовчуванням у блоковій декларації, як це. Тож вам потрібно використовувати splat і встановити типовий параметр у самому коді proc.
Або, залежно від вашої сфери всього цього, може бути простіше передати ім'я методу.
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
Але це здається, що ви хотіли б тут більше шматок багаторазового використання коду.