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
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.
Ruby - birden çok değerleri ile ifade ...
Ruby blok ve blok arasındaki fark...
Dava çizgi dönüştürme deve dava ruby...
ruby 1.9: UTF-8 geçersiz bayt sırası...
9 blok çapraz menşe web yazı tipi indi...