Ruby - 从 .find 中恢复但未找到任何内容

Ruby - recovering from .find not finding anything

$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'

这是一个包含哈希的数组。

我的目标是编写一个方法,允许我传递一个像 "John Smith" 这样的名字作为参数并取回那个人的角色,无论是 "Boss" 还是 "Worker."

如果名字不在数据库中,我希望它return "Not available."

我试着用我的

result ||= "Not available"

当我传递给方法的名称实际存在时,代码会按预期工作,但如果我尝试传递一个不存在的名称,它甚至不会按照我的预期进行。相反,它 return 指出了错误。

我认为错误来自 [0][:role] 在未定义的对象上被调用,因此没有可用的数组方法。但是,我不确定如何解决这个问题。

请随意批评我的代码中与当前问题无关的任何其他方面。我的耳朵是开着的。

问题是您正在尝试查找 [:role],即使 find 失败并且 returns nil

尝试将查找和散列查找拆分为两个语句,以便您可以先检查 nil。

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