gpt4 book ai didi

ruby - 继承 Ruby Hash,对象没有 Hash 的方法?

转载 作者:数据小太阳 更新时间:2023-10-29 08:28:12 26 4
gpt4 key购买 nike

我正在创建一个散列对象,以便编写一个小脚本,一次在文件中读取一行,并将数组分配到我的散列类中。我得到的结果截然不同,这取决于我是否将 Hash 子类化,加上使用 super 改变了我不理解的东西。

我的主要问题是,如果不对散列进行子类化 (< Hash),它就可以完美地工作,但是我没有得到 Hash 的方法(比如遍历键并从中获取东西......子类化 Hash 可以让我做那些事情, 但似乎只有散列数组的 last 元素被存储....所以任何关于如何获得子类方法的见解。我在上​​找到的 Dictionary 类是一个很好的例子这个网站,并且完全按照我的意愿行事,所以我试图了解如何正确使用它。

filename = 'inputfile.txt.'

# ??? class Dictionary < Hash
class Dictionary
def initialize()
@data = Hash.new { |hash, key| hash[key] = [] }
end
def [](key)
@data[key]
end
def []=(key,words)
@data[key] += [words].flatten
@data[key]
# super(key,words)
end
end


listData = Dictionary.new

File.open(filename, 'r').each_line do |line|
line = line.strip.split(/[^[:alpha:]|@|\.]/)
puts "LIST-> #{line[0]} SUB-> #{line[1]} "
listData[line[0]] = ("#{line[1]}")
end

puts '====================================='
puts listData.inspect
puts '====================================='
print listData.reduce('') {|s, (k, v)|
s << "The key is #{k} and the value is #{v}.\n"
}

如果有人了解哈希的子类化是怎么回事,并且有一些指示,那就太好了。

运行时没有显式

./list.rb:34:in `<main>': undefined method `reduce' for #<Dictionary:0x007fcf0a8879e0> (NoMethodError)

这是我尝试以任何方式迭代我的哈希时看到的典型错误。

这是一个示例输入文件:

listA   billg@microsoft.com
listA ed@apple.com
listA frank@lotus.com
listB evanwhite@go.com
listB joespink@go.com
listB fredgrey@stop.com

最佳答案

我无法使用您的代码重现您的问题:

d = Dictionary.new               #=> #<Dictionary:0x007f903a1adef8 @data={}>
d[4] << 5 #=> [5]
d[5] << 6 #=> [6]
d #=> #<Dictionary:0x007f903a1adef8 @data={4=>[5], 5=>[6]}>
d.instance_variable_get(:@data) #=> {4=>[5], 5=>[6]}

但是,如果您不子类化或包含定义它的类/模块,或者您自己定义它,您当然不会得到 reduce!

您实现Dictionary 的方式必然会出现问题。您应该尽可能调用 super 而不是重新实现。例如,这很有效:

class Dictionary < Hash
def initialize
super { |hash, key| hash[key] = [] }
end
end

d = Dictionary.new #=> {}
d['answer'] << 42 #=> [42]
d['pi'] << 3.14 #=> [3.14
d #=> {"answer"=>[42], "pi"=>[3.14]}

如果你想重新实现内部散列的存储方式和位置(即使用@data),你必须至少重新实现each(因为是几乎所有 Enumerable 方法调用的)和 getter/setter。当您只能更改一种方法时,不值得付出努力。

关于ruby - 继承 Ruby Hash,对象没有 Hash 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13109183/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com