2015-11-24 87 views
0
$array_hash = [ 
       { 
        first: "John", 
        last: "Smith", 
        role: "Boss" 
       }, 
       { 
        first: "Jane", 
        last: "Doe", 
        role: "Worker" 
       }] 

def find_employees_role(name) 
    name = name.split(" ") 

    result = $array_hash.find do | e | 
     e[:first] == name[0] && e[:last] == name[1] #line16 
    end[:role] 

    result ||= "Not available" 
end 


find_employees_role("Joe Smith") #line 22 
find_employees_role("John Smith") #"Boss" 



Error: undefined method `[]' for nil:NilClass 
(repl):16:in `find_employees_role' 
(repl):22:in `initialize' 

這是一個哈希數組。紅寶石 - 從.find恢復找不到任何東西

我的目標是寫一個方法,讓我傳似「約翰·史密斯」的名稱作爲參數,並找回那種人,無論是「老闆」或角色「工人」。

如果名字不在數據庫中,我希望它返回「不可用」。

我試着寫在我的

結果|| =「不可用」

的代碼按預期工作時,我的名字傳遞給方法確實存在,但如果我嘗試傳遞一個不在那裏的名字,它甚至沒有做我期望的。相反,它會返回所述的錯誤。

我相信,錯誤來自[0]:被稱爲上的東西是不確定的,因此沒有可用的那些陣列方法[作用]。但是,我不知道如何解決這個問題。

隨意批評我的代碼的任何其他方面並不手頭涉及到的問題。我的耳朵是開放的。

回答

0

問題是即使find失敗並且返回nil,您正在嘗試查找[:role]

嘗試分裂的查找和哈希查找到兩個語句,因此你可以首先檢查零。

entry = hash.find do |e| ... end 
result = entry ? entry[:role] : "not available" 
+0

一般來說,'找到做| E | ...結束[鍵]'只是難以閱讀。保存代碼高爾夫的那種快捷方式。 – AShelly

+0

我明白了。非常感謝。哈... –