Geçen ruby'de bir yöntemi parametre olarak
Etrafında Ruby ile biraz karışıklık için çalışıyorum. Kitap "" Ruby. Zeka Kolektif Programlama algoritmaları (Python verilen) uygulamaya çalışıyorum bu yüzden
Bölüm 8 yazar, bir yöntemi, bir parametre olarak geçer. Ama bu Ruby Python değil iş gibi görünüyor.
Burada yöntemi var
def gaussian(dist, sigma=10.0)
foo
end
ve başka bir yöntem ile bu aramak istiyorum
def weightedknn(data, vec1, k = 5, weightf = gaussian)
foo
weight = weightf(dist)
foo
end
Elimde tek bir hata olur
ArgumentError: wrong number of arguments (0 for 1)
CEVAP
Proc bir nesne istiyorum:
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
Böyle bir blok bildiriminde varsayılan bir değişkeni ayarlayabilirsiniz unutmayın. Bir şap kullanın ve işlem kodu varsayılan ayarları kendisi.
< / ^ hr .
Ya tüm bu sizin kapsamı bağlı olarak, daha kolay bir yöntem adı yerine geçmek olabilir.
def weightedknn(data, vec1, k = 5, weightf = :gaussian)
...
weight = self.send(weightf)
...
end
Bu durumda sadece bir nesne üzerinde tanımlanmış bir yöntemi çağırmak yerine kod tam bir çırpıda geçiyoruz. Mesela bu yapı ne kadar bağlı object_that_has_the_these_math_methods.send
11 *değiştirmek gerekir
< / ^ hr .
Son ama en az değil, yöntemi bir blok asabilirsiniz.
def weightedknn(data, vec1, k = 5)
...
weight =
if block_given?
yield(dist)
else
gaussian.call(dist)
end
end
...
end
wegihtedknn(foo, bar) do |dist|
# square the dist
dist * dist
end
Ama kod daha yeniden kullanılabilir parçalar burada istediğiniz gibi geliyor.