2015-07-03 4 views
0

У меня есть класс Temperature, с двумя подклассами Цельсия и Фаренгейта, которые в своих методах инициализации принимают аргумент с Fixnum как температуру, которая затем вызывает супер инициализацию с температурой как запись в опции хэш.Правильная инициализация Ruby не соответствует правильному аргументу

Однако, если я позвоню Celsius.new(50), в суперкласса код инициализации я получаю сообщение об ошибке «NoMethodError: неопределенный метод` каждый»50: Fixnum» означает исходный аргумент из конструктора подкласса не передается как опции хэш.

Я не могу на всю жизнь понять, почему это происходит!

Пожалуйста, смотрите мой код ниже:

class Temperature 
    def initialize(opts={}) 
     opts.each { |k,v| instance_variable_set("@#{k}", v) } 
    end 

    def self.from_celsius(c) 
     Temperature.new(:c => c) 
    end 

    def self.from_fahrenheit(f) 
     Temperature.new(:f => f) 
    end 

    def self.ftoc(n) 
     (n - 32) * (5.0/9.0) 
    end 

    def self.ctof(n) 
     n * (9.0/5.0) + 32 
    end 

    def in_fahrenheit 
     @f.nil? ? Temperature.ctof(@c) : @f 
    end 

    def in_celsius 
     @c.nil? ? Temperature.ftoc(@f) : @c 
    end 
end 

class Celsius < Temperature 
    def initialze(n) 
     super(:c => n) 
    end 
end 

class Fahrenheit < Temperature 
    def initialize(n) 
     super(:f => n) 
    end 
end 
+0

Не совсем - это означает, что он звонит суперкласса инициализируем с вашим «50» Я не знаю решения. .. но вот в чем проблема –

ответ

2

заметил проблему:

class Celsius < Temperature 
    def initialze(n) 
    # should be initialize 
    super(:c => n) 
    end 
end 
+0

Я не умный человек. – aiven

+0

хе-хе ... мы все виновны в этих;) –

Смежные вопросы