2016-09-30 25 views
1

如果我有:這for循環是不願意傳球,沒有方法錯誤

@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 
    } 
    ] 
} 

我需要返回的寵物,如果我給它的「名」的功能,所以我有:

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 

但是這沒有通過測試。我得到:

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

這是一個這麼簡單的函數,我不知道爲什麼它不通過。

+2

你能指定這個錯誤與哪一行有關嗎? 你還可以提供你調用find_pet_by_name的代碼嗎? – sokkyoku

回答

4

你的代碼的問題是你沒有完成循環。您返回petnil的第一個值pet,即"Sir Percy"散列。你的代碼應該如下。

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} 

我建議你改用方法Enumerable#find

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 

順便說一句,Rubiests很少使用for循環。 (我已經從來沒有使用過)。最好使用枚舉數,例如each,find,select,reduce,部分原因是迭代變量的值(這裏是pet)在枚舉器的塊外部是不可見的。