在hash迭代器中使用proc而不是block



我为正在处理的扩展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(代码不正确(

问题是我想使用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

我已经查过那些页面了

  • 关于StackOverflow的帖子
  • 外部网页1
  • 外部网页2
  • 外部网页3

那么,使用字母使用所提供的块的正确方法是什么?!

编辑分配文本:

each_word对使用方法和块找到的单词进行迭代,从最常见的单词开始到最不常见的单词。该块获取单词、通过的绝对频率和相对频率。(我认为我做得对(

字母staticseach_letter它的行为与each_word类似,但在该方法中,应该使用Proc而不是block

您在尝试中所做的是用Proc包装yield,但实际上您可以用Proc:替换yield

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(而如果使用yield,则使用block_given?(。您也可以使用proc&.call,它是安全的导航操作员。

顺便说一句,您可能应该将rank +=1更改为rank + 1,在这里重新分配变量的值没有意义,因为它无论如何都不会更改哈希中的值(数字是不可变的(。

最新更新