Ruby 超级初始化没有正确传递参数

Ruby super initialization not passing argument correctly

我有一个 class 温度,有两个子classes,摄氏度和华氏度,它们在它们的初始化方法中接受一个带有 Fixnum 的参数作为温度,然后用温度作为选项散列中的条目。

但是,如果我调用 Celsius.new(50),在 superclass 初始化代码中,我收到错误“NoMethodError: undefined method `each' for 50:Fixnum" 表示来自 subclass 构造函数的原始参数未作为选项散列传递。

我一辈子都弄不明白为什么会这样!

请看下面我的代码:

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

发现问题:

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