2013-05-05 2 views
0

루비에서 초보자와 서머셋 온도를 읽을 하우스 클래스를 구축. 나는 올바른 길을 가고 있으며 온도를 업데이트하는 방법을 어떻게 호출할까요?루비 온도 하우스 클래스

집과 온도 조절기의 동작을 모델링하는 코드를 작성해 보겠습니다. 이 문제를 해결하려면 House 클래스를 정의해야합니다. 다음은 모델해야하는 동작입니다.

각 집마다 자체 온도가 있습니다. 각 집에는 update_temperature라는 메서드가 있습니다! 이는 히터 또는 에어컨이 켜져 있는지 여부에 따라 온도를 높이거나 낮 춥니 다. 또한 현재 온도를 화면에 인쇄합니다. 히터가 켜진 상태에서 공기 조화 기의 경우 1 부 하여 현재의 온도 상승은, 현재 온도는 온/오프 에 히터를 회전 할 수 있으며, 공기 조화기를 켤 수 2 개 단위

만큼 감소 온/오프

가 보너스로, 스마트 하우스에 대한이 동작을 추가 할 수 있습니다

각 집이 자신의 최소 및 최대 온도 current_temperature 최대 온도에 도달 있고, 에어컨이 켜지고 히터가집니다 꺼짐 (켜져있는 경우) 현재 _ 온도가 최저 온도에 도달하면 히터가 켜지고 에어컨이 꺼집니다 (켜져있는 경우). 각 하우스마다 고유 한 상태가 있어야합니다. 즉 하우스 클래스의 여러 인스턴스를 각각 만들 수 있습니다.

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! 
+0

을 당신이 올바른 궤도에, 당신은 이런 식으로 부를 것이다 : 하우스 1 = House.new (75, 거짓, TRUE); house1.update_temperature! update_temperature에서 puts를 사용하는 것을 피 하겠지만 실제로는 액션을 수행해야합니다. – vgoff

+0

사람들이 당신을 하향 투표하고 있지만, 당신의 질문은 전혀 바보가 아닙니다. 내가 제공 한 대답에는 자동 온도 조절 장치가 포함되어 있지 않습니다. 내 코드를 이해하고 직접 써모 스탯 수업을 작성하십시오. 발생할 수있는 문제와 의문점은 루비스트로서 성장하는 데 도움이 될 것입니다. 포스가 함께하길. –

+0

이 게시물을 잠그고 있으므로 지금 편집하지 않습니다. 잠금이 해제 된 후에도이 방법으로 다시 편집하지 않을 것입니다. 감사! –

답변

2

정확하게 질문을 읽는다면 인스턴스 메소드를 호출하려면 먼저 해당 클래스의 인스턴스를 만들어야합니다. 이 경우 하우스 클래스가 있습니다.

my_house = House.new(72, true, false) 

my_house.update_temperature! 

귀하의 코드에는 몇 가지 문제가 있습니다.

먼저 일반적으로 if 문에 then을 사용하는 것은 바람직하지 않습니다. 대신 당신이

@current_temp += 1 if @heater 

또는

if @heater 
    @current_temp += 1 
end 

두 번째로

if @heater then @current_temp += 1 

교체와 같은 것을 할 수 있습니다, 나는 경우/다른 문에 update_temperature! 방법을 다시 작성할 수 있습니다. 나는 그걸 당신에게 배워두고 떠날거야.

마지막으로, 당신은 당신의 초기화 방법은 당신이 Why's Poignant Guide to Ruby을 확인해야한다고 말하는 결론을 내릴 것

def initialize(current_temp, heater, air_cond) 
    @current_temp = current_temp 
    @heater = heater 
    @air_cond = air_cond 
    end 

과 같을 것이다 있도록 초기화 방법에 end를 추가해야합니다. 이것은 당신이 다루고있는 몇 가지 문제들로 엄청나게 도움이 될 것입니다.

+0

정보 주셔서 감사합니다. 예, initialize 메서드 다음에 '끝'이 있어야합니다. 복사하고 붙여 넣을 때 어떤 일이 발생했는지 확실하지 않습니다. 위의 업데이트 된 코드를 참조하십시오. 따라서 my_house = House.new (72, true, false)를 반환하면 my_house.update_temperature! 그것은 73 권리를 돌려 보내야합니까? 왜냐하면 순간에 그것은 단지 돌아 오는 것입니다 - – chipman

+0

잘 생각해보십시오. 귀하의 초기화 메서드를 잘 보인다. 현재 온도를 72로 지정하고 있습니다.'update_temperature'는 어떨까요? 어떤 코드 줄이 현재 온도를 바꿀 수 있습니까? 당신의 코드를보십시오. 각 변수에 대해 인쇄를 실행하여 변경 될 수있는 부분을 확인하십시오. – jason328

+0

OK 이제는 0으로 증가하기 때문에 @current_temp를 0으로 초기화 할 필요가 없습니다. 이는 내가 원하지 않는 것입니다. – chipman

3

여기에서 시뮬레이션을 실행 중입니다.첫 번째 물리적 단위 SY 보석을 설치합니다

gem install sy 

을 그리고,이 하나는 통제 된 환경 시뮬레이션 주위에 갈 수있는 방법은 다음과 같습니다,

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 

이 통제 된 환경 믹스 인을 설정 한 다음의 사용 하원 클래스를 만들어 보자 그것.

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 

이제 우리는 재생할 수 있습니다 :

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 
+0

초보자를위한 복잡한? 이것은 나중에 OP를 위해 좋을 것이나, 나는 Ruby로 막 시작하는 누군가에게 그것을 추천하지 않을 것이다. – jason328

+1

그것은 실제 문제를 해결하는 방법, 특정 사례를 보여줍니다. 이것으로 주택 단열을 설정할 수 있으며, 일부 속성을 가진 서모 스탯 개체를 만들 수 있으며 주택 온도를 얼마나 잘 유지하는지 확인할 수 있습니다. 나중에 문 열림, 창 열기, 단열재의 극적인 저하로 나타낼 수 있습니다. ControlledEnvironment 믹스 인을 포함하여 클래스 비행기를 만들거나 SpaceStation 클래스를 만들 수 있습니다. –

+0

그래, 내가 필요한 것은 시뮬레이션이기는하지만 약간 시급하다.하지만 보니 멋지다.) – chipman