我是ruby的新手,并希望得到一些帮助:)
我修复了我的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上我可以在@ 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
答案 0 :(得分:5)
您永远不会调用方法keywords
,因此,您永远不会执行使用数据填充@keywords
的代码。它仍然没有。
答案 1 :(得分:1)
@keywords将保持为零,直到您调用方法keywords
,该方法将@keywords初始化为已排序的条目键。
看起来您在没有先调用关键字的情况下在字典对象上调用find
。这将导致@keywords的值为零。