Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么我的代码在ruby中返回零?_Ruby On Rails_Ruby_Hash - Fatal编程技术网

Ruby on rails 为什么我的代码在ruby中返回零?

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

我在计算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, 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设置为空散列。