Ruby Factory Method rpsec温度转换器

时间:2013-02-12 03:36:31

标签: ruby

这里不太了解工厂方法...... 这是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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您需要在initialize方法中指定:c。然后你需要self.from_celsius来返回一个新的Temperature实例。你可能想要这样的东西:

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 

答案 2 :(得分:0)

你得到“错误:无法将符号转换为整数 - ”的原因是因为你在你的温度.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