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