2016-09-30 1 views
1

Wenn ich keine Methode Fehler passieren, haben:Diese for-Schleife ist nicht bereit,

@pet_shop = { 
    pets: [ 
    { 
     name: "Sir Percy", 
     pet_type: :cat, 
     breed: "British Shorthair", 
     price: 500 
    }, 
    { 
     name: "King Bagdemagus", 
     pet_type: :cat, 
     breed: "British Shorthair", 
     price: 500 
    } 
    ] 
} 

ich eine Funktion benötigen, die das Tier zurück, wenn ich den „Namen“ geben, so habe ich:

def find_pet_by_name(pet_shop, name) 
    for pet in pet_shop[:pets] 
    if pet[:name] == name 
     return pet 
    else return nil 
    end 
    end 
end 

Aber das ist nicht der Test bestanden. Ich bekomme:

NoMethodError: undefined method `[]' for nil:NilClass 

Das ist so eine einfache Funktion, ich weiß nicht, warum es nicht passiert.

+2

Können Sie bitte angeben, auf welche Zeile sich dieser Fehler bezieht? Können Sie auch den Code angeben, in dem Sie 'find_pet_by_name' aufrufen? – sokkyoku

Antwort

4

Das Problem mit Ihrem Code ist, dass Sie die Schleife nicht abschließen. Sie geben entweder pet oder nil für den ersten Wert pet zurück, nämlich den "Sir Percy" Hash. Ihr Code sollte wie folgt lauten.

def find_pet_by_name(pet_shop, name) 
    for pet in pet_shop[:pets] 
    return pet if pet[:name] == name 
    end 
    nil 
end 

find_pet_by_name @pet_shop, "King Bagdemagus" 
    #=> {:name=>"King Bagdemagus", :pet_type=>:cat, :breed=>"British Shorthair", 
    # :price=>500} 

Ich würde vorschlagen, Sie stattdessen Enumerable#find die Methode verwenden.

name = "King Bagdemagus" 
@pet_shop[:pets].find { |h| h[:name] == name } 
    #=> {:name=>"King Bagdemagus", :pet_type=>:cat, :breed=>"British Shorthair", 
    # :price=>500} 

name = "Queen Bagdemagus" 
@pet_shop[:pets].find { |h| h[:name] == name } 
    #=> nil 

Übrigens verwenden Rubies selten for Schleifen. (Ich habe nie verwendet eins). Es ist besser, einen Enumerator wie each, find, select, reduce zu verwenden, weil der Wert der Iterationsvariablen (hier pet) außerhalb des Blocks eines Enumerators nicht sichtbar ist.

Verwandte Themen