簡體   English   中英

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

[英]using proc instead of block inside hash iterator

我為我正在處理的 class 編寫了自己的迭代器,它擴展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

你在這里所做的嘗試是用 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 ,在這里重新分配變量的值是沒有意義的,因為它不會改變 hash 中的值(數字是不可變的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM