Ruby on rails 为什么我的代码在ruby中返回零?
我在计算0华氏度的冰点。我的代码返回零。我正在努力解决一个问题。所以我创建了一个温度类。创建了一个散列。我迭代每个散列。使用该值,我迭代并进行计算 我的代码Ruby on rails 为什么我的代码在ruby中返回零?,ruby-on-rails,ruby,hash,Ruby On Rails,Ruby,Hash,我在计算0华氏度的冰点。我的代码返回零。我正在努力解决一个问题。所以我创建了一个温度类。创建了一个散列。我迭代每个散列。使用该值,我迭代并进行计算 我的代码 class Temperature attr_accessor :f def initialize(f) f = Hash.new @f = f end def to_fahrenheit 50 end def to_celsius f.each do |key, valu
class Temperature
attr_accessor :f
def initialize(f)
f = Hash.new
@f = f
end
def to_fahrenheit
50
end
def to_celsius
f.each do |key, value|
@to_c = if value == 32
0
elsif value == 212
100
elsif value == 98.6
37
elsif value == 68
20
else
f = value.to_f
(f -32 ) / 1.8
end
end
@to_c
end
end
我的测试
require "temperature"
describe Temperature do
describe "can be constructed with an options hash" do
describe "in degrees fahrenheit" do
it "at 50 degrees" do
end
describe "and correctly convert to celsius" do
it "at freezing" do
Temperature.new({:f => 32}).to_celsius.should == 0
end
it "at boiling" do
Temperature.new({:f => 212}).to_celsius.should == 100
end
it "at body temperature" do
Temperature.new({:f => 98.6}).to_celsius.should == 37
end
it "at an arbitrary temperature" do
Temperature.new({:f => 68}).to_celsius.should == 20
end
end
end
end
end
我的终点站
1) Temperature can be constructed with an options hash in degrees fahrenheit and correctly convert to celsius at freezing
Failure/Error: Temperature.new({:f => 32}).to_celsius.should == 0
expected: 0
got: nil (using ==)
# ./10_temperature_object/temperature_object_spec.rb:31:in `block (5 levels) in <top (required)>'
在initialize方法中,您正在覆盖传递到函数中的散列
def initialize(f)
f = Hash.new
@f = f
end
应该是
def initialize(f={})
@f = f
end
在initialize方法中,您正在覆盖传递到函数中的散列
def initialize(f)
f = Hash.new
@f = f
end
应该是
def initialize(f={})
@f = f
end
您在代码中多次重用了变量f,我认为这是导致问题的原因
您将命名传递到构造函数f中的变量,然后为其分配一个新的空哈希。这会将本地attr_访问器:f或@f设置为新哈希 然后,在执行f=value.to_f计算的块中重新指定局部f,同时实际循环f
您需要解决构造函数的重新分配问题,然后使用不同的局部变量名进行值的转换。您在代码中多次重复使用了变量f,我认为这导致了您的问题
您将命名传递到构造函数f中的变量,然后为其分配一个新的空哈希。这会将本地attr_访问器:f或@f设置为新哈希 然后,在执行f=value.to_f计算的块中重新指定局部f,同时实际循环f
您需要解决构造函数的重新分配问题,然后使用不同的局部变量名称进行value.to_f转换。对于此类情况,您应该真正将其存储在°C或°K中,因为它们是在科学环境中使用的。°F是一个时代错误,大多数美国人和其他少数人都使用它。同样奇怪的是,当°F->°C转换是一个简单的线性方程时,这里有这么多特殊情况:°C=°F-32*5/9还请注意,您的测试覆盖率非常低,你应该测试至少12个随机点,以确保你得到正确的值。这只是充满了困惑。Temperature.newf:20.to_fahrenheit返回50?对于这样的东西,你真的应该存储在摄氏度或摄氏度,因为这些都是在科学环境中使用的。°F是一个时代错误,大多数美国人和其他少数人都使用它。同样奇怪的是,当°F->°C转换是一个简单的线性方程时,这里有这么多特殊情况:°C=°F-32*5/9还请注意,您的测试覆盖率非常低,你应该测试至少12个随机点,以确保你得到正确的值。这只是充满了困惑。温度.newf:20华氏度返回50度?你说得对..:我实际上在寻找OP错过@f的地方。。那就是我找到的地方。。而且错误地给出了一个糟糕的答案。。但是你应该有+1..你是对的我实际上在寻找OP错过@f的地方。。那就是我找到的地方。。而且错误地给出了一个糟糕的答案。。但是你应该有+1..这会将你的本地attr_访问器:f或@f设置为一个新的散列。否,f=Hash.new不调用f=accessor函数。它创建一个名为f的局部变量。要调用访问器函数,他需要调用self.f=Hash.new。但是,在下一行中,在@f=f中,他确实将@f设置为空哈希。这会将您的本地attr\u访问器:f或@f设置为新哈希。否,f=Hash.new不调用f=accessor函数。它创建一个名为f的局部变量。要调用访问器函数,他需要调用self.f=Hash.new。然而,在下一行中,他将@f=f设置为空散列。