SORU
14 NİSAN 2010, ÇARŞAMBA


Nasıl Dizi yapıyor#bir blok geçirildiğinde iş mi?

Bir sorun array.sort{ |x,y| block } tam olarak nasıl çalışır, bu yüzden bunu kullanmak için nasıl bir anlayış yaşıyorum?

Ruby documentation bir örnek:

   a = [ "d", "a", "e", "c", "b" ]
   a.sort                     #=> ["a", "b", "c", "d", "e"]
   a.sort { |x,y| y <=> x }   #=> ["e", "d", "c", "b", "a"]

CEVAP
14 NİSAN 2010, ÇARŞAMBA


Örnek

a.sort

olur denk

a.sort { |x, y| x <=> y }

Bildiğiniz gibi, sıralama bir dizi, ihtiyacınız karşılaştırır elementleri (Eğer şüphe, sadece denemek için uygulamak herhangi bir sıralama algoritması kullanmadan herhangi bir karşılaştırma yok <, >, <= veya >=).

Verdiğiniz blok gerçekten sort algoritması tarafından iki öğe karşılaştırmak için çağrılacak bir fonksiyon.x y her zaman giriş dizisi, yürütme sırasında sort algoritması tarafından seçilmiş bazı unsurları olacaktır.

sort algoritma bu karşılaştırma/blok 18* *yöntemi: ihtiyacını karşılayacak işlev üstlenecek

  • eğer x -1 iade < y
  • x = y ise 0 döndürür
  • x ^ eğer iade 1 . y

Yeterli bir karşılaştırma sağlamak için başarısızlık/engelle tanımsız olan dizi neden olur işlevi.

Şimdi neden olduğunu anlamak gerekir

a.sort { |x, y| x <=> y }

ve

a.sort { |x, y| y <=> x }

siparişlerini aynı dizi döndürür.

Siz karşılaştırma sınıfların herhangi birinde <=> işlevi uygulamak Tate Johnson eklendi ne üzerinde durmak için, aşağıdaki kazanırsınız

  1. Sen de görülebilir modülü Comparable sizin sınıf hangi otomatik olarak tanımlamak için aşağıdaki yöntemleri: between?, ==, >=, <, <= ve >.
  2. Sınıfınızın örneklerini şimdi sort (bağımsız değişken olmadan yani) varsayılan çağırma kullanarak sıralanabilir.

Not <=> yöntem zaten verilen her yerde yapar anlamda ruby'nin standart kütüphane (Bignum, Array, File::Stat, Fixnum, String, Time, vb...).

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 0TACTICAL0HIPPY0

    0TACTICAL0HI

    30 EYLÜL 2012
  • Rachel Raum

    Rachel Raum

    10 EYLÜL 2007
  • The Pet Collective

    The Pet Coll

    5 Ocak 2012