繁体   English   中英

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

[英]private method `select' called for nil:NilClass (NoMethodError)

我是红宝石的新手,请帮忙:)

我已在我的ruby代码中修复了该错误,但是我对为什么该修复程序感到困惑。

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

scanned = @keywords.select { |key| key.match(word) }

,位于以下方法中:

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

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

scanned = @entries.keys.sort.select { |key| key.match(word) }

我在下面的类结构中将@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

您永远不会调用method keywords ,因此,您永远不会执行用数据填充@keywords的代码。 它仍然为零。

@keywords将保持为零,直到您调用method keywords ,该方法会将@keywords初始化为已排序的输入键。

看起来您是在没有首先调用关键字的情况下在字典对象上调用find 这将导致@keywords的值为零。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM