2010-03-04 3 views
3

경고를 여러 번 보내지 않고 한 번만 알려주는 것이 가능합니까? 이상적으로 내가 한 번만 발생하고 싶습니다 반면어떻게하면 루비에서만 경고가 발생합니까?

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! 

을 생산하고 있습니다.

레일을 사용하지 않고 1.8 및 1.9의 루비를 사용할 수 있습니다.

대체 방법으로는 내 경고 시스템을 작성하거나 (예 : 이와 같은 의도적 인 경고 만 포함) 또는 SoylentGreen#eat (메소드가 호출되지 않은 경우에도 표시되게 할 수 있음) 외부에 경고를 넣는 것입니다.

+2

스포일러 경고! –

답변

0

이렇게 할 수 없습니까? 나는 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 
+0

예제의 경우, 각 루프 사이클마다 클래스의 새 인스턴스를 만드는 경우에는 작동하지 않습니다. – Amber

+0

이 경로를 사용하려는 경우 클래스 변수를 사용할 수 있습니다. –

+0

그래, 그걸 봐야했다. 나는 루비를 사용하지 않았다. – ChaosPandion

5

..

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

warnings 보석은 중복 경고를 숨 깁니다

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 
관련 문제