используя pro c вместо блока внутри ha sh итератора - PullRequest
0 голосов
/ 04 мая 2020

Я написал свой собственный итератор для класса, над которым я работаю, который расширяет 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

используя Pro c (не правильный код)

проблема в том, что я хочу использовать тот же код, используя 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.

1 Ответ

1 голос
/ 04 мая 2020

То, что вы делаете здесь в своей попытке, это обертывание доходность с Pro c, но в действительности вы можете заменить доходность с Pro c:

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 или { ... }) и преобразует в pro c.

Чтобы проверить, был ли передан блок, вы просто использовали бы if proc (тогда как, если бы вы использовали yield, вы бы использовали block_given?). В качестве альтернативы вы можете использовать proc&.call, который является оператором безопасной навигации .

Кстати, вам, вероятно, следует изменить rank +=1 на rank + 1, нет смысла переназначать значение переменной здесь, поскольку в любом случае он не изменит значение в га sh (числа неизменны).

...