Как сделать, чтобы предупреждение появлялось только один раз в ruby? - PullRequest
3 голосов
/ 04 марта 2010

Можно ли сказать, что ruby ​​выдает предупреждение только один раз, а не несколько раз?

class SoylentGreen
  def eat
    warn "Algae harvesting not implemented. Soylent green is people!"
  end
end

5.times do
  soylent_green = SoylentGreen.new
  soylent_green.eat
end

производит

Algae harvesting not implemented. Soylent green is people!
Algae harvesting not implemented. Soylent green is people!
Algae harvesting not implemented. Soylent green is people!
Algae harvesting not implemented. Soylent green is people!
Algae harvesting not implemented. Soylent green is people!

тогда как в идеале я бы хотел, чтобы это произошло только один раз.

Я не использую рельсы, и имею доступ к ruby ​​1.8 и 1.9.

Альтернативы могут включать в себя написание моей собственной системы предупреждений (которая будет охватывать только преднамеренные предупреждения, подобные этой) или вывод предупреждения за пределы SoylentGreen#eat (что приведет к его отображению, даже если метод не был вызван) .

Ответы [ 3 ]

5 голосов
/ 04 марта 2010

На основании ответа Хаоса ..

class SoylentGreen
  def eat
    warn_once "Algae harvesting not implemented. Soylent green is people!"
  end
  def warn_once(msg)
    @@warned||=false
    if not @@warned then
       @@warned = true
       warn msg
    end
  end
end
2 голосов
/ 27 ноября 2012

предупреждений драгоценный камень скрывает двойные предупреждения:

require 'warnings'

def danger!
  warn "Fire in the disco!"
end

danger!
danger!

Warnings.grep(/fire/)
# => [...]

Warnings.from('foo/bar.rb')
# => [...]

Warnings.from_method('danger!')
# => [...]

exit
#
# Warnings:
#
#   fire in the disco!
#      lib/foo/bar.rb:42
0 голосов
/ 04 марта 2010

Не могли бы вы сделать что-то подобное? Я полагаю, что 2 амперсанда делают переменную статической.

class SoylentGreen
  @@warned = false
  def eat
    if not @@warned then
       @@warned = true
       warn "Algae harvesting not implemented. Soylent green is people!"
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...