您需要一个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
请注意,您不能在这样的块声明中设置默认参数。因此,您需要使用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
但这听起来像您在这里想要更多可重用的代码块。