Классы в кейсах - PullRequest
       18

Классы в кейсах

0 голосов
/ 05 марта 2012

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

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

Ответы [ 3 ]

2 голосов
/ 05 марта 2012

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 голос
/ 05 марта 2012

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

0 голосов
/ 05 марта 2012

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

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

...