2017-04-21 13 views
0

아래 프로그램은 "99 Bottles of Beer"노래의 가사를 출력합니다.삼항 연산자 거짓 인 경우 True 옵션 출력

노래가 1 병 남았던 지점에 도달하면 "병"이라는 단수 형태가 사용됩니다. 이 문제를 해결하기 위해 필자는 삼항 연산자를 사용하여 주어진 순간에 정확한 대소 문자를 선택했습니다. 는 삼항 연산자는 false로 평가 명확 경우에도 그러나

beer_bottles 카운트가 내 프로그램의 1에 도달, 마지막 문장은 아직도, "병"을 출력합니다.

IRB의 세 번째 연산자를 beer_bottles = 1으로 테스트 한 결과 잘못된 옵션 인 "병"이 올바르게 출력되었습니다.

왜 이런 일이 발생하는지 이해하는 데 큰 도움이됩니다.

beer_bottles = 99 

while beer_bottles >= 2 do 
    plural = "bottles" 

    singular = "bottle" 

    plural_or_singular = beer_bottles > 1 ? plural : singular 

    puts "#{beer_bottles} #{plural_or_singular} of beer on the wall, #{beer_bottles} #{plural_or_singular} of beer." 

    beer_bottles -= 1 

    puts "BOTTLE COUNT: #{beer_bottles}" 

    puts "Take one down and pass it around, #{beer_bottles} #{plural_or_singular} of beer on the wall." 
end 
+1

Q : 당신은 당신이 실제로 그 시점에서 "1"로 내려 하시겠습니까? Q : 감소 후 * 삼항을 움직여야합니까? – paulsm4

+2

while 루프를 2 번에서 멈 춥니 다. 하나를 빼면'plural_or_singular'를 다시 계산하지 않습니다. 그걸 더 내려야합니다. –

답변

2

가장 안전한 것은 순간을 출력 변수에 체크합니다. 마지막 줄을 인쇄하기 전에 단순히 삼항을 아래로 움직일 수 있습니다.

나는 그것을 분리 된 방법으로 추출하려고한다. 사실 레일스가 pluralize으로하는 일입니다.

def pluralize(count, noun) 
    "#{count} #{count==1 ? noun : noun + 's'}" 
end 

그런 다음 코드는 다음과 같습니다 : 우리는 우리 자신의 단순화 된 버전을 만들 수 있습니다

99.downto(1) do |n| 
    puts "#{pluralize(n, "bottle")} of beer on the wall, #{pluralize(n, "bottle")} of beer." 
    puts "Take one down and pass it around, #{pluralize(n-1, "bottle")} of beer on the wall." 
end 
+0

Ayy! '.downto'와 커스텀 메소드를 사용하는 것이 훨씬 더 깨끗합니다. – Edson

1

다시 업데이트되었다 beer_bottles -= 1beer_bottles로 후 plural_or_singular을 계산하지 않습니다.

해결책 : 할

beer_bottles = 99 

while beer_bottles >= 2 do 
    plural = "bottles" 

    singular = "bottle" 

    plural_or_singular = beer_bottles > 1 ? plural : singular 

    puts "#{beer_bottles} #{plural_or_singular} of beer on the wall, #{beer_bottles} #{plural_or_singular} of beer." 

    beer_bottles -= 1 
    plural_or_singular = beer_bottles > 1 ? plural : singular 
    puts "BOTTLE COUNT: #{beer_bottles}" 

    puts "Take one down and pass it around, #{beer_bottles} #{plural_or_singular} of beer on the wall." 
end 
+2

첫 번째 검사는 이제 완전히 불필요합니다. –

+0

아, 예! 어떤 이유에서 나는 interpolated 할 때마다'plural_or_singular'가 계산되고 있다고 가정했습니다. 웁스! 고마워요! – Edson