首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby Temperature House类

Ruby Temperature House类
EN

Stack Overflow用户
提问于 2013-05-06 01:37:50
回答 2查看 505关注 0票数 0

Ruby的初学者,并构建了一个读取恒温器温度的House类。我是在正确的轨道上吗?我该如何调用该方法来更新温度?

让我们编写一些代码来模拟房屋及其恒温器的行为。对于这个挑战,您应该定义一个House类。以下是您应该建模的行为:

每个房子都有自己的当前温度,每个房子都有一个叫做update_temperature的方法!这将根据加热器或空调机是否打开来增加或降低温度。它还会将当前温度打印到屏幕上。当加热器打开时,当空调打开时,电流温度上升1个单位,电流温度下降2个单位。

你可以打开/关闭加热器,也可以打开/关闭空调。

作为额外的奖励,您可以为智能房屋添加此行为:

代码语言:javascript
复制
class House
  def initialize(current_temp, heater, air_cond)
    @current_temp = current_temp
    @heater = heater
    @air_cond = air_cond
  end

  def update_temperature!
    if @heater
      puts @current_temp += 1
    elsif @air_cond
      puts @current_temp -= 2
    end
  end
end

my_house = House.new(34, false, true)
my_house.update_temperature!
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-06 01:51:48

如果我没看错你的问题,要调用一个实例方法,首先必须创建一个该类的实例。在本例中,您有一个House类。

代码语言:javascript
复制
my_house = House.new(72, true, false)

my_house.update_temperature!

话虽如此,你的代码还是有一些问题的。

首先,在if语句中使用then通常是不好的做法。取而代之的是,您可以通过替换

代码语言:javascript
复制
if @heater then @current_temp += 1

使用

代码语言:javascript
复制
@current_temp += 1 if @heater

代码语言:javascript
复制
if @heater
  @current_temp += 1
end

其次,我可能会将update_temperature!方法重写为if/else语句。我会让你自己去学习。

最后,您需要向initialize方法添加一个end,以便您的initialize方法如下所示

代码语言:javascript
复制
   def initialize(current_temp, heater, air_cond)
     @current_temp = current_temp
     @heater = heater
     @air_cond = air_cond
   end

最后,我会说你应该去看看Why's Poignant Guide to Ruby。这将极大地帮助您处理一些正在处理的问题。

票数 2
EN

Stack Overflow用户

发布于 2013-05-06 02:10:07

您在这里运行的是模拟。首先为物理单元安装SY gem:

代码语言:javascript
复制
gem install sy

然后,这是如何在受控环境模拟中进行的:

代码语言:javascript
复制
require 'sy' # physical units
module ControlledEnvironment
  class Air
    SPECIFIC_HEAT_CAPACITY = 1.005.kJ.kg(-1).K(-1)
    attr_accessor :volume, :temperature, :humidity, :pressure, :gas_composition
    # to simplify things, let's forget about humidity, gas compositions...

    def initialize( volume: 500.m(3),
                    temperature: SY::TRIPLE_POINT_OF_WATER + 20.K,
                    pressure: 101.3.kPa )
      @volume, @temperature, @pressure = volume, temperature, pressure
    end

    def density
      density_of_air_at_0_celsius = 1.205.kg.m(-3)
      atmospheric_pressure = 101.3.kPa
      density_of_air_at_0_celsius *
        SY::TRIPLE_POINT_OF_WATER / temperature *
        pressure / atmospheric_pressure
    end

    def heat!( energy )
      @temperature += energy / ( SPECIFIC_HEAT_CAPACITY * volume * density )
    end

    def cool!( energy ); heat -energy end
  end

  class ThermalExchanger
    attr_accessor :power_output
    attr_reader :target

    def initialize( power_output, target )
      @power_output = power_output
      @target = target
    end

    def act( delta_time, pow=power_output )
      target.heat! pow * delta_time
    end
  end

  class Heater < ThermalExchanger
    def heat!( delta_time )
      act delta_time
    end
  end

  class Cooler < ThermalExchanger
    def cool!( delta_time )
      act( delta_time, -power_output )
    end
  end
end

在设置了一个受控环境混入之后,让我们使用它来创建一个House类。

代码语言:javascript
复制
class House
  include ControlledEnvironment # including a mixin

  # a house has air, one heater, and one cooler
  attr_reader :heater, :cooler, :air

  def initialize( heater_power: 1.kW, cooler_power: 1.kW,
                  air_volume: 500.m(3) )
    @air = Air.new volume: air_volume
    @heater = Heater.new( heater_power, @air )
    @cooler = Cooler.new( cooler_power, @air )
  end

  # its temperature is defined as air temperature
  def temperature
    "#{(air.temperature - SY::TRIPLE_POINT_OF_WATER).to_f} centigrade"
  end

  # and, given current heating / cooling power settings, we can step forward in time
  def step( delta_time=1.min )
    heater.heat! delta_time
    cooler.cool! delta_time
    puts "After #{delta_time.in( :min )} minutes, the temperature is #{temperature}"
  end
end

现在我们可以玩:

代码语言:javascript
复制
house = House.new heater_power: 1.5.kW, cooler_power: 1.kW, air_volume: 1500.m(3)
house.temperature
#=> "20.0 centigrade"
house.step 1.h
#=> After 60 minutes, the temperature is 21.040302385090797 centigrade
house.step 1.h
#=> After 60 minutes, the temperature is 22.08429649473362 centigrade
house.heater.power_output = 0.kW # turn off the heater, for instance
#=> #<±Magnitude: 0.W >
house.step 30.min
#=> After 30 minutes, the temperature is 21.013285968306377 centigrade
100.times do house.step end
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16387220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档