2012-03-05 7 views
0

Я не могу определить, почему эти две функции ведут себя по-разному. Я мог просто использовать символы или собственные константы, но у меня есть глубокое желание узнать, что здесь происходит (и если я что-то делаю плохо).Занятия в операторах дела

def convert(value, type) 
    case type 
    when Integer 
     value.to_i 
    when String 
     value.to_s 
    else 
     value 
    end 
end 

def convert_with_if(value, type) 
    if (type == Integer) 
     value.to_i 
    elsif (type == String) 
     value.to_s 
    else 
     value 
    end 
end 

n = 4.4 
p convert(n, Integer) #=> 4.4 
p convert_with_if(n, Integer) #=> 4 

ответ

2

case звонки ===, оператор равенства случая. Module#===, а также по расширению Class#===, фактически проверяет, является ли класс данного аргумента получателем или является его потомком. String === object практически эквивалентен object.kind_of? String.

convert 1, String 

Было бы эквивалентно:

case String 
    when Integer 
    1.to_i 
    when String 
    1.to_s 
end 

Это как спрашивать is the String class an Integer? или is the String class a String?. Ответ на оба вопроса: No, it is a Class..

С точки зрения кода, String.class возвращает Class, который не связан каким-либо образом Integer или даже самого String. Если вы представили предложение when Class или when Module, оно будет выполняться каждый раз.

1

В вашем новообращенный функции вы получаете тип Integer, который Class. Вот почему это отличается от того, что вы ожидаете.

0

Метод convert не подходит ни к чему и не соответствует else, поэтому вы получаете 4.4.

Кроме того, если вы ожидаете, что метод будет выводить 4.4, вам нужно будет использовать десятичное число, а не целое число.