[英]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
擁有相同的代碼
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.