我为我正在研究的类写了我自己的迭代器,它扩展了 hash
.
我写的迭代器是用块来实现的,现在我试图用 Proc
.但我有点不知道如何在这种情况下使用它! :(
def each_word
rank=0
self.sort_by{|k,v| v}.reverse.to_h.keys.each{ |key,abs, rel | yield rank+=1,
key,self[key], self.frequency(key) if block_given? }#iterate with aid block
end
我想这样使用它:
puts "Rang - Anzahl - Häufigkeit(%) - Wort"
obj1.each_word do |rank,word,abs ,rel|
puts "#{rank} #{abs} #{rel}% #{word} "
end
问题是,我想用同样的代码,用的是 Proc
def each_letter
rank=0
x=self.sort_by{|k,v| v}.reverse.to_h# this wont work but wrote it as helpless try
my_proc=Proc new { |key,abs, rel | yield rank+=1, key,x[key], x.frequency(key) }
my_proc.call()
end
我已经查过那几页了
那么,正确使用提供的块使用字母的方法是什么呢!?
each_word
迭代使用方法和块找到的单词,从最常见的单词开始到最不常见的单词。块得到的单词,绝对频率和相对频率传递。 (我想我的做法是正确的)信函静态
each_letter
它的行为类似于each_word
但在该方法中,你应该用一个Proc
而非block
.
在你的尝试中,你所做的是 包皮 产量与Proc,但在现实中你可以 替换 产量与Proc。
def each_word(&proc)
rank=0
keys = self.sort_by{|k,v| v}.reverse.to_h.keys
keys.each do |key, abs, rel|
if proc
proc.call(rank+=1, key,self[key], self.frequency(key))
end
end
end
什么?&proc
是否需要 阻止 传入的(无论是用 do ... end
或 { ... }
句法)和 转换 到一个 proc。
要检查是否给定了一个块,你可以简单地使用 if proc
而如果你使用的是收益率,你会使用 block_given?
). 您也可以使用 proc&.call
也就是 安全员.
顺便说一下,你可能应该改变 rank +=1
到 rank + 1
在这里重新分配变量的值是没有意义的,因为反正也不会改变哈希中的值(数字是不可变的)。