0

不太了解这里的工厂方法......这是respec行:

Temperature.from_celsius(50).in_celsius.should == 50

这是我现在拥有的:

出错...不太确定如何满足这一点。谢谢

class Temperature
attr_accessor :f
attr_accessor :c   

   def initialize(args)
     @f = args[:f]
     @c = args[:c]
   end

  def in_fahrenheit
     @f or
    (@c*9.0/5.0)+32 
  end

  def in_celsius

   @c or
  (@f-32)*(5.0/9.0)
   end

   def self.from_celsius(c)
    new c
    end


   end
4

3 回答 3

1

这应该有帮助

class Temperature
  def initialize c
    @c = c
  end

  def in_celsius
    @c
  end

  def in_fahrenheit
    @c *9.0 /5.0 +32
  end

  # factory pattern typically instantiates a new object
  def self.from_celsius(c)
    new c
  end
end

puts Temperature.from_celsius(50).in_celsius      #=> 50
puts Temperature.from_celsius(100).in_fahrenheit  #=> 212

除非您希望attr_accessor :c用户可以公开访问temp.c. 没有它,用户将被迫使用temp.in_celsiustemp.in_fahrenheit

于 2013-02-12T03:45:26.250 回答
0

您收到“错误:无法将符号转换为整数 -”的原因是因为您在 Temperature.from_celsius(50) 中,当您应该向它传递一个键和符号时,您正在向它传递一个整数对于选项哈希。

初始化

class Temperature
  def initialize(opts = {})
    @options = opts
  end

类工厂方法

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

实例方法

def in_celsius
    if @options[:c] == nil
      return (@options[:f]-32) * (5/9.to_f)
    else
      return @options[:c]
  end
end
于 2013-06-09T20:30:46.117 回答
0

您需要在初始化方法中分配给 :c 。然后你需要 self.from_celsius 返回一个新的温度实例。你可能想要这样的东西:

class Temperature
  attr_accessor :c
  def initialize c
    @c = c
  end

  def in_celsius
    @c
  end

  def in_fahrenheit
    9/5 * @c + 32
  end

  def self.from_celsius(num)
    Temperature.new(num)
  end

  def self.from_fahrenheit(num)
    Temperature.new((num-32)*5/9)
  end
end

现在 rspec 显示为真

1.9.1p378 :047 > Temperature.from_celsius(50).in_celsius.should == 50
 => true 
1.9.1p378 :131 > Temperature.from_fahrenheit(32).in_celsius.should == 0
 => true 
于 2013-02-12T03:45:11.973 回答