2016-04-08 22 views
1

bir yöntem hatırlatarak bu durum bildirimde bir döngü yapmak için iyi bir yol olup olmadığını bilmek istiyorum. Yanıt (kullanıcı girişi) hatalı girdi ise yöntemi geri çağırmak tamam mı? Daha iyi bir yolu var mı?Bir vaka deyimi ruby ​​

def game_type # Selecting humans or computers as players 
    puts "Please select game type by number:" 
    puts "1 - human vs human" 
    puts "2 - computer vs computer" 
    puts "3 - human vs computer" 
    response = gets.chomp.to_i 

    case response 
    when 1 
     puts "human vs human" 
    when 2 
     puts "computer vs computer" 
    when 3 
     puts "human vs computer" 
    else 
     game_type 
    end 
    end 

cevap

3

Yinelemeli olarak böyle bir yöntem çağrılması çok kötü bir şey çünkü her bir özyinelemeli çağrı için, çağrı yığına ek bir derinlik eklenir ve ne kadar derin olacağını tahmin edemezsiniz, bu da performans için kötüdür. Genel olarak, mümkünse özyinelemeden kaçınılmalıdır. Bu durumda, özyinelemeli arama gerektirmeyen bir döngü kullanın.

def game_type 
    loop do 
    puts <<~_ 
     Please select game type by number: 
     1 - human vs human 
     2 - computer vs computer 
     3 - human vs computer 
    _ 
    response = gets.to_i 
    case response 
    when 1 
     puts "human vs human" 
     break 
    when 2 
     puts "computer vs computer" 
     break 
    when 3 
     puts "human vs computer" 
     break 
    end 
    end 
end 
0

etkileşim bu tür için standart model şikayet ve başka döngü için geri gönderen bir else şube sahip olmaktır.

Ruby'yi kullanırken akılda tutulması gereken bir şey, çok tekrar edilmekten kaçınmak için düzenli bir yapıda böyle şeyler denemeli ve tanımlamalıdır. "Kendinizi Tekrarlama" (DRY) prensibi çok önemlidir. Kuru tut! oldukça kolay menünüzü sunmak için de süper kolay gelecekte daha fazla türleri eklemek artı kolaylaştırır

GAME_TYPE_LIST = [ 
    "Human vs. Human", 
    "Computer vs. Computer", 
    "Human vs. Computer" 
] 

# Convert this list to a hash indexed by 1, 2, 3, etc. 
GAME_TYPES = Hash[GAME_TYPE_LIST.each_with_index.map { |type, i| [ i + 1, type ] }] 

: Yani bu durumda

Keza

GAME_TYPES.each do |i, type| 
    puts '%d - %s' % [ i, type ] 
end 

, geliyor seçmek için zaman:

game_type = nil 

begin 
    puts "Enter type:" 

    game_type = gets.chomp.to_i 
end while (!GAME_TYPES[game_type]) 

Döngü kullanmaya devam ederseniz, doğru şekilde kullanabilirsiniz.

+0

Haydi, "chomp" kelimesini kullanmayı daha iyi biliyorsunuz. – sawa

+0

@sawa Yeni satırın sıyrılmasıyla ilgili ne korkunç? 'to_i' umurunda olmayabilir, ama temiz veriyi beslemeyi severim. – tadman

-1

Bu davanın açıklamada bir döngü yapmak için tamam yolu olup olmadığını bilmek istiyorum. Yanıt (kullanıcı girişi) hatalı girdi ise yöntemi geri çağırmak tamam mı?

iken sen can sawa söylediği gibi, bu performans ile ilgili nedenlerden dolayı, Ruby iyi bir uygulama değil, öyle yap.

Daha iyi bir yolu var mı?

Aksine kullanım özyineleme yerine, loop kullanın:

GAME_TYPES = { 
    1 => "human vs computer", 
    2 => "computer vs computer", 
    3 => "human vs human" 
} 

def game_type 
    loop do  
    puts <<~___ 
     Please select game type by number: 
     1 - human vs human 
     2 - computer vs computer 
     3 - human vs computer 
    ___ 
    selection = gets.to_i 
    if game_type_str = GAME_TYPES[selection] 
     puts game_type_str 
     break 
    end 
    end 
end 

(Ben de çok daha özlü break bir demet sahip olmaktan kod kılan bir case açıklamada, yerine bir sözlük kullanmak için kodunuzu değişti ifadeleri).

+0

"Ben ** de ** bir kod kullanmak için ** kodunuzu ** değiştirdi" ** Bu ** ** ** ** ** ** ** değiştiniz mi? Lütfen diğer cevaplarda parazit yapmayın. Söyleyecek bir şeyiniz varsa, kendi cümlelerinizi kullanarak, yazdığınız gibi davranarak kendi kelimelerinize yazın. – sawa

+0

Üzgünüm, kopyaladığımı sanıyorum, ama gerçekten bir "while" bloğunu "loop" olana dönüştürmenin yüz yolu yok ... Kod yazmadan önce yüce yazdım ve cevabını ancak bundan sonra gördüm (cevabınızdan bahsetmek için düzenledim, ki bu da beni destekledi). –

+1

Aynı '' ', aynı tanımlayıcı' _' ile aynı modda heredoc ile tek bir 'puts' yöntemi kullanmak ve gereksiz 'chomp'ı kesin olarak kaldırmak tüm tesadüf olduğunu düşünmek zor. – sawa