SORU
7 ŞUBAT 2009, CUMARTESİ


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
7 ŞUBAT 2009, CUMARTESİ


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FailArmy U

    FailArmy U

    29 AĞUSTOS 2009
  • hidetake takayama

    hidetake tak

    3 Mart 2009
  • Submissions101

    Submissions1

    23 ŞUBAT 2007

İLGİLİ SORU / CEVAPLAR