2012-05-04 16 views
11

Herhangi biri, Ruby'de verim ve iade kullanımının sonucunu çıkarmamda bana yardımcı olabilir. Ben Ruby'ye yeni başlayan biriyim, bu kadar basit örnekler çok beğeniliyor.Ruby'de verim ve dönüşün kullanımı

Teşekkürler! Yöntemle ilişkili bloğu çağırmak için

cevap

28

İade beyanı, diğer benzer programlama dillerinde çalıştığı şekilde çalışır, yalnızca kullanıldığı yöntemden döner. Geri dönmek için aramayı atlayabilirsiniz, çünkü Ruby'deki tüm yöntemler her zaman son ifadeyi döndürür. Yani böyle bir yöntem bulabilirsiniz: Aslında böyle bir şey yaptığını aynıdır

def method 
    "hey there" 
end 

:

def method 
    return "hey there" 
end 

diğer taraftan yield, yönteme parametre olarak verilen bloğu excecutes.

method do 
    puts "doing something" 
end 

Bunun sonucu, ekranda baskı olacağını aşağıdaki 2 satırları:

"do somthing..." 
"doing something" 
Yani böyle bir yöntemi olabilir:

def method 
    puts "do somthing..." 
    yield 
end 

Ve sonra bu gibi kullanmak

Umarım biraz temizler. Bloklar hakkında daha fazla bilgi için this link adresini kontrol edebilirsiniz.

+0

Bloklara verilen link bozuk – adamscott

+1

İşte iyi bir tane [link] (http://mixandgo.com/blog/mastering-ruby-blocks-in-less-than-5-minutes) – adamscott

+0

teşekkürler @adamscott, linki seninkiyle değiştirdim. şerefe – Deleteman

6

yield kullanılır. Mevcut yönteminden

[1, 2, 3].each {|elem| puts elem} 

return çıkışlar ve dönüş değeri olarak "argüman" kullanır: Çok gibi, yöntem ve onun parametreleri sonra blok (küme parantezi temelde sadece kodu) yerleştirerek bunu gibi pek:

def hello 
    return :hello if some_test 
    puts "If it some_test returns false, then this message will be printed." 
end 

Ama sen herhangi yöntemlerde dönüş anahtar kelimeyi kullanmayı var unutmayın; Ruby, iade yapılmazsa değerlendirilen son ifadeyi döndürür. Böylece bu iki equivelent gibidir:

# A simple iterator that operates on an array 
def each_in(ary) 
    i = 0 
    until i >= ary.size 
    # Calls the block associated with this method and sends the arguments as block parameters. 
    # Automatically raises LocalJumpError if there is no block, so to make it safe, you can use block_given? 
    yield(ary[i]) 
    i += 1 
    end 
end 

# Reverses an array 
result = []  # This block is "tied" to the method 
       #       | | | 
       #       v v v 
each_in([:duck, :duck, :duck, :GOOSE]) {|elem| result.insert(0, elem)} 
result # => [:GOOSE, :duck, :duck, :duck] 

Ve bir sayı happy olup olmadığını görmek için bir yöntem uygulamak için kullanacaktır return için bir örnek:

def explicit_return 
    # ... 
    return true 
end 

def implicit_return 
    # ... 
    true 
end 
İşte

bir yield için örnek :

class Numeric 
    # Not the real meat of the program 
    def sum_of_squares 
    (to_s.split("").collect {|s| s.to_i ** 2}).inject(0) {|sum, i| sum + i} 
    end 

    def happy?(cache=[]) 
    # If the number reaches 1, then it is happy. 
    return true if self == 1 
    # Can't be happy because we're starting to loop 
    return false if cache.include?(self) 
    # Ask the next number if it's happy, with self added to the list of seen numbers 
    # You don't actually need the return (it works without it); I just add it for symmetry 
    return sum_of_squares.happy?(cache << self) 
    end 
end 

24.happy? # => false 
19.happy? # => true 
2.happy? # => false 
1.happy? # => true 
# ... and so on ... 

Bu yardımcı olur umarız!

+0

Cevabınız için teşekkürler :) – nxhoaf

+0

evet, sorun değil!:) – Jwosty

+0

@Jwosty 'def mutlu değil mi? (Önbellek = [])'? –

0
def cool 
    return yield 
end 

p cool {"yes!"} 

Verim anahtar kelimesi Ruby'ye bloğun kodunu yürütmesini bildirir. Bu örnekte, blok "yes!" dizesini döndürür. cool() yönteminde açık bir döndürme ifadesi kullanıldı, ancak bu durum da örtülü olabilir.