SORU
18 NİSAN 2009, CUMARTESİ


Ruby'bilgisayar bilimi ile ilgili s verim özelliği

Geçenlerde Ruby blokları ve verimli özellikler keşfetti, ve merak ediyordum nerede bu bilgisayar bilimi teorisi açısından uygun mu? Fonksiyonel bir programlama tekniği, ya da belirli bir şey mi?

CEVAP
19 NİSAN 2009, Pazar


Ruby yield C gibi bir yineleyici değil# ve Python. yield kendisi aslında blok Ruby nasıl çalıştığını anlamak kez gerçekten basit bir kavram.

Evet, blok Ruby düzgün işlevsel bir dil olsa bile, fonksiyonel bir programlama özelliği vardır. Aslında, Ruby yöntemi lambda taşları olan anonim işlevler oluşturmak için Lisp sözdizimi — ödünç olan blok nesneleri oluşturmak için kullanır. Bilgisayar bilimleri açısından, Ruby blokları (Lisp lambda fonksiyonları) closures. Ruby, yöntemleri genellikle sadece bir blok ötede. (Daha geçebilir, ama garip bir şey.)

Ruby yield anahtar sözcük metodu için verilmiş bir blok arıyorum sadece bir yoludur. Bu iki örnek eşdeğerdir:

def with_log
  output = yield # We're calling our block here with yield
  puts "Returned value is #{output}"
end

def with_log(&stuff_to_do) # the & tells Ruby to convert into
                           # an object without calling lambda
  output = stuff_to_do.call # We're explicitly calling the block here
  puts "Returned value is #{output}"
end

İlk durumda, sadece bir blok var ve bunu demeni olacağını tahmin ediyoruz. Diğer, Ruby nesne bloğu sarar ve bir argüman olarak geçirir. İlk olarak daha etkili ve okunabilir olduğunu, ama etkili aynı. Ya böyle diyorsunuz:

with_log do
  a = 5
  other_num = gets.to_i
  @my_var = a   other_num
end

Ve @my_var atanmış bulunduysa o değeri yazdırmak istiyorum. (TAMAM, bu tamamen aptalca bir işlevi var, ama siz anladınız sanırım.)

Blok Ruby bir çok şey için kullanılır. Hemen hemen her yerde Java gibi bir dilde bir döngü kullanmak istiyorum, blok yöntemleri ile Ruby yerini aldı. Örneğin,

[1,2,3].each {|value| print value} # prints "123"
[1,2,3].map {|value| 2**value}    # returns [2, 4, 8]
[1,2,3].reject {|value| value % 2 == 0} # returns [1, 3]

Andrew belirtildiği gibi, aynı zamanda yaygın dosya açma ve daha birçok yerde kullanılıyor. Temelde her zaman bazı özel mantık (dizi sıralama ya da dosya işleme gibi) kullanabileceği standart bir işlevi var, bir blok kullanın. Diğer anlamları da var, ama bu cevap zaten çok uzun zayıf kalbi okuyucular kalp krizine neden olacak korkuyorum. Umarım bu konu üzerinde kafa karışıklığı temizler.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Khan Academy

    Khan Academy

    17 Kasım 2006
  • snookie77

    snookie77

    2 Mart 2006
  • UrAvgConsumer

    UrAvgConsume

    1 Ocak 2012