我正试着和Ruby打成一片。因此,我尝试实现“编程集体智能”Ruby一书中的算法(在Python中给出)。
在第八章中,作者传递了一个方法a作为参数。这似乎适用于Python,但不适用于Ruby。
我这里有一个方法
def gaussian(dist, sigma=10.0)
foo
end
并希望使用另一个方法调用此方法
def weightedknn(data, vec1, k = 5, weightf = gaussian)
foo
weight = weightf(dist)
foo
end
我得到的只是一个错误
ArgumentError: wrong number of arguments (0 for 1)
发布于 2009-02-07 15:50:16
引用块和Procs的注释是正确的,因为它们在Ruby中更常见。但是如果你愿意,你可以传递一个方法。调用method
来获取方法,调用.call
来调用它:
def weightedknn( data, vec1, k = 5, weightf = method(:gaussian) )
...
weight = weightf.call( dist )
...
end
发布于 2009-02-07 00:41:05
正常的Ruby方法是使用块。
所以它应该是这样的:
def weightedknn( data, vec1, k = 5 )
foo
weight = yield( dist )
foo
end
它的用法如下:
weightenknn( data, vec1 ) { |dist| gaussian( dist ) }
此模式在Ruby中广泛使用。
发布于 2009-02-07 00:06:59
你必须调用函数对象的方法" call“:
weight = weightf.call( dist )
编辑:正如评论中所解释的,这种方法是错误的。如果你使用的是Procs而不是普通函数,这将会起作用。
https://stackoverflow.com/questions/522720
复制相似问题