在哈希迭代器中使用proc代替block。

问题描述 投票:0回答:1

我为我正在研究的类写了我自己的迭代器,它扩展了 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

我已经查过那几页了

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

编辑作业文本。

each_word 迭代使用方法和块找到的单词,从最常见的单词开始到最不常见的单词。块得到的单词,绝对频率和相对频率传递。 (我想我的做法是正确的)

信函静态 each_letter 它的行为类似于 each_word但在该方法中,你应该用一个 Proc 而非 block.

ruby iterator block proc
1个回答
1
投票

在你的尝试中,你所做的是 包皮 产量与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 +=1rank + 1在这里重新分配变量的值是没有意义的,因为反正也不会改变哈希中的值(数字是不可变的)。

© www.soinside.com 2019 - 2024. All rights reserved.