私有方法`select'调用nil:NilClass(NoMethodError)

vic*_*tor 2 ruby class

我是红宝石的新手,并希望得到一些帮助,请:)

我修复了我的ruby代码中的错误,但我很困惑为什么修复工作.

当我输入以下行时,我得到以下错误私有方法`select'调用nil:NilClass(NoMethodError):

scanned = @keywords.select { |key| key.match(word) }
Run Code Online (Sandbox Code Playgroud)

,位于以下方法中:

def find(word)
    return {} unless @entries.any?
    scanned = @keywords.select { |key| key.match(word) }
    found ={}
    if scanned.any? 
        scanned.each do |x| found.merge!( { x => @entries[x] } )
        end
    else
        {}
    end
    found
end
Run Code Online (Sandbox Code Playgroud)

但如果我用以下内容替换上面的错误行,则此错误消失:

scanned = @entries.keys.sort.select { |key| key.match(word) }
Run Code Online (Sandbox Code Playgroud)

我在下面的类结构中将@keywords定义为@keywords = @ entries.keys.sort ... 为什么我不能在@keywords上使用'.select'但我可以在@keywords的内容上使用它?

class Dictionary
def initialize
    @entries = {}
end

def entries
    @entries
end

def add(entry)
    @entries = entry.is_a?(Hash) ? @entries.merge!(entry) : @entries.merge!( {entry => nil} )
end

def keywords
    @keywords = @entries.keys.sort
end

def include?(keyword)
    @entries.keys.include?(keyword)
end

def find(word)
    return {} unless @entries.any?
    scanned = @keywords.select { |key| key.match(word) }
    found ={}
    if scanned.any? 
        scanned.each do |x| found.merge!( { x => @entries[x] } )
        end
    else
        {}
    end
    found
end

def printable
    printable = @entries.sort.map do |key, value| %Q{[#{key}] "#{value}"}
    end
    printable.join("\n")
end
end
Run Code Online (Sandbox Code Playgroud)

JTG*_*JTG 5

您永远不会调用该方法keywords,因此,您永远不会执行填充@keywords数据的代码.它仍然是零.