2016-11-30 3 views
2

정수와 비교 : 통과 할 때Case 문 제가 루비와 안돼서하고이 경우 문이 방식으로 동작하는 이유 나도 몰라

def evaluate(number) 
    case 
    when number<0 
    puts "#{number} is negative" 
    when 0..50 
    puts "#{number} is between 0 and 51" 
    when 51..100 
    puts "#{number} is between 51 and 100" 
    else 
    puts "#{number} is greater than 100" 

    number = gets.chomp.to_i 

    puts evaluate(number) 

-4 예를 들어 작동하지만 경우 I 다시이보다 크다 100

인 다른이고 를 출력하는 경우로는 음의 값을 해석

def evaluate(number) 
    case number 
    when number<0 ... 

그 케이스 번호를 추가 그게 뭐야? 누군가가 나를 도울 수 있다면 정말 고마워.

+0

이 코드는 몇 개의'end' 문이 누락되어있는 것처럼 불완전한 것처럼 보입니다. 들여 쓰기가 충분하여 파이썬에 사용 되었습니까? – tadman

답변

5

시도해보십시오. case 문은 비교를 ===을 사용하기 때문에 다른 방법

def evaluate(number) 
    case number 
    when -Float::INFINITY...0 
    puts "#{number} is negative" 
    when 0..50 
    puts "#{number} is between 0 and 51" 
    when 51..100 
    puts "#{number} is between 51 and 100" 
    else 
    puts "#{number} is greater than 100" 
    end 
end 

puts evaluate(-43) 
# -43 is negative 
puts evaluate(0) 
# 0 is between 0 and 51 
puts evaluate(27) 
# 27 is between 0 and 51 
puts evaluate(100) 
# 100 is between 51 and 100 
puts evaluate(9999) 
# 9999 is greater than 100 

, 당신은 효과적으로 위에서 제시 한 첫 번째 경우 문에서 무슨 일이 일어나고있는 것입니다

def evaluate(number) 
    case 
    when number < 0 
    puts "#{number} is negative" 
    when (0..50) === number 
    puts "#{number} is between 0 and 51" 
    when (51..100) === number 
    puts "#{number} is between 51 and 100" 
    else 
    puts "#{number} is greater than 100" 
    end 
end 

을 작성할 수 있습니다.

Range#=== : "obj [인수]가 범위의 요소이면 true를 반환하고 그렇지 않으면 false를 반환합니다." 즉 (1..10) === number(1..10).include?(number) 인 경우에만 true입니다.

저는이 대안을지지하지 않습니다. 나는 case 문에서 무슨 일이 벌어지고 있는지 보여주는 데 도움을 주었다. 다음은 내가 더 잘 읽을 수있는 대안 중 하나입니다.

def evaluate(number) 
    case 
    when number < 0 
    puts "#{number} is negative" 
    when number <= 50 
    puts "#{number} is between 0 and 51" 
    when number <= 100 
    puts "#{number} is between 51 and 100" 
    else 
    puts "#{number} is greater than 100" 
    end 
end 
+2

삼중 항등변 대신에,'(x..y) .include? (z)'는? Array, Set 등에서 작동하므로 더 일반적인 패턴입니다. – tadman

+0

@tadman, 나는 동의하고'Range # ==='에 대한 문서와 관련하여 언급했다 :'(1..10) === number'는'(1..10). ? (숫자)'를 포함하십시오. 당신은 물론 그것을 사용할 수 있습니다. –

+0

대단히 고마워요! 둘 다 잘 작동하지만 나는 마지막 하나가 최고라고 생각한다. 나는 계속 공부할거야. – Ima