SORU
18 HAZİRAN 2010, Cuma


Blok Ruby ve verimleri

Ruby nasıl çalıştıkları blok yield anlamaya çalışıyor ve ben.

Nasıl yield kullanılır? Baktım Raylar uygulamaları çok garip bir şekilde yield kullanın.

Biri bana açıklayabilir ya da onları anlamak gittiğin yeri bana gösterin?

CEVAP
18 HAZİRAN 2010, Cuma


Evet, ilk başta biraz kafa karıştırıcı.

Ruby, yöntemleri kodu keyfi kesimleri gerçekleştirmek için bir kod bloğu alabilirsiniz.

Bir yöntemi bir blok bekler, yield işlevini çağırarak onu çağırır.

Bu çok kullanışlı, örneğin, bir liste üzerinde yineleme ya da özel bir algoritma olarak sağlamaktır.

Aşağıdaki örnek alalım:

Person bir sınıf adı ile başlatılan tanımlamak, ve çağrıldığında, sadece name öznitelik bloğu alınan geçebilecek do_with_name bir yöntem sağlamak için gidiyorum.

class Person 
    def initialize( name ) 
         @name = name
    end

    def do_with_name 
        yield( @name ) 
    end
end

Bu bize yöntem Ara ve rastgele kod bloğu geçmek için izin verecek.

Mesela yapardık adını yazdırmak için:

person = Person.new("Oscar")

#invoking the method passing a block
person.do_with_name do |name|
    puts "Hey, his name is #{name}"
end

Baskı:

Hey, his name is Oscar

Dikkat edin, blok, parametre olarak bir değişken name (bu değişken gibi bir şey diyebilirsin, ama mantıklı name çağrı yapan N. B.) denilen alır. Kodu yield çalıştırdığında @name değeri bu parametre ile doldurur.

yield( @name )

Farklı bir eylemi gerçekleştirmek için başka bir blok sağlayabiliriz. Örneğin, adı nedir

#variable to hold the name reversed
reversed_name = ""

#invoke the method passing a different block
person.do_with_name do |name| 
    reversed_name = name.reverse
end

puts reversed_name

=> "racsO"

Aynı yöntem (do_with_name) - farklı bir blok kullandık.

Bu örnek önemsiz. Daha ilginç kullanımları dizideki tüm öğeleri filtrelemek için

 days = ["monday", "tuesday", "wednesday", "thursday", "friday"]  

 # select those which start with 't' 
 days.select do | item |
     item.match /^t/
 end

=> ["tuesday", "thursday"]

Ya da özel bir örnek sıralama algoritması dize boyutuna göre verebiliriz:

 days.sort do |x,y|
    x.size <=> y.size
 end

=> ["monday", "friday", "tuesday", "thursday", "wednesday"]

Bu seni daha iyi anlamak için yardımcı olur umarım.

Eğer bloğu isteğe bağlıdır eğer BTW, bu gibi aramalısın:

yield(value) if block_given?

Eğer isteğe bağlı ise, sadece onu çağırmak.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • hotstrikegently

    hotstrikegen

    26 AĞUSTOS 2011
  • RealPapaPit

    RealPapaPit

    16 Mart 2009
  • williamfitzsimmons

    williamfitzs

    14 Mart 2008