Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 如何监视实例变量并触发方法?_Ruby_Oop_Triggers - Fatal编程技术网

Ruby 如何监视实例变量并触发方法?

Ruby 如何监视实例变量并触发方法?,ruby,oop,triggers,Ruby,Oop,Triggers,上面的ruby代码有一个Plastic类和一个Man类,Man(john)的实例可以对Plastic(塑料片)的实例加热,当加热时,塑料件的温度升高,当温度超过其熔点时,塑料件的@状态从:固态变为:液态 在增加温度方法中增加温度后,我正在手动改变@状态(从:固体变为:液体) 升高温度方法实际上做了两件事,我想把它们分开 我希望在@temperature穿过熔化点时调用melt方法(通过某种异步触发器),而无需手动进行温度检查。这可能吗?在您提供的上下文中,从概念上讲,melt是一个动词,但实际上

上面的ruby代码有一个
Plastic
类和一个
Man
类,
Man(john)
的实例可以对
Plastic(塑料片)
的实例加热,当加热时,
塑料件的温度升高,当温度超过其
熔点时,塑料件的
@状态从:固态变为
:液态

增加温度
方法中增加
温度后,我正在手动改变
@状态(从:固体变为:液体)

升高温度
方法实际上做了两件事,我想把它们分开


我希望在
@temperature
穿过
熔化点时调用
melt
方法(通过某种异步触发器),而无需手动进行温度检查。这可能吗?

在您提供的上下文中,从概念上讲,
melt
是一个动词,但实际上它没有任何作用。熔化是温度的副作用,所以你不会神奇地熔化塑料。物理学为你做到了这一点。那为什么不呢

class Plastic
  MELTING_POINT = 125

  attr_accessor :temperature, :state

  def initialize(room_temp)
    @temperature = room_temp
    @state = :solid
  end

  def inc_temperature
    @temperature += 50
    if @temperature >= Plastic::MELTING_POINT
      self.melt
    end
  end

  def melt
    @state = :liquid
  end
end

class Man
  def apply_heat(obj)
    puts "#{self.class} applies heat onto #{obj.class}"
    obj.inc_temperature 
  end
end

john = Man.new
plastic_piece = Plastic.new(27)

loop do
  john.apply_heat(plastic_piece)
  if plastic_piece.state == :liquid
    puts "plastic_piece just melted at #{plastic_piece.temperature} degress"
    break
  else
    puts "plastic_piece retains shape at #{plastic_piece.temperature} degrees"
  end
end

没有一种内置的方式来“观察”变量(例如“观察者”),您必须自己制作这个系统。也许可以从ActiveRecord中得到一些启发,你可以有一些中央
更新
方法,一些在更新时注册回调的系统可能很有趣。如果塑料只有在一定温度下熔化时才会变成液体,为什么你需要第二个属性来改变它的值?难道它不能仅仅是一种通过温度值来确定熔体的方法吗?为什么
state
不能是一个始终有值的变量?这里的方法仅在调用时计算并返回值。如果有一个动画可以根据温度值设置熔化过程的动画,这将不起作用。不管怎样,这很有帮助,所以我决定升级。你是在尝试为终端应用程序还是网络应用程序制作动画?如果是web,您肯定希望用javascript而不是Ruby来实现。但我不明白为什么这不能用于动画。事实上,将状态存储为单独的对象需要比我提供的答案更多的计算能力。动画需要为熔化开始的时间和持续时间设置某种阈值。你有这个公式吗?我没有做任何动画,那只是我脑海中浮现的一个想法。你之前说过,熔化是温度的副作用,所以你不会神奇地熔化塑料。物理学为你做到了这一点。。那为什么我觉得自己是那个融化塑料的人(通过呼叫州政府)?。按照你的逻辑,其他实体(物理)应该正确地进行熔化?我不知道,但将状态存储为对象会如何改变任何事情?我不知道。它只会让你的代码变得更加复杂,没有明显的原因。如果您需要更多帮助,请更新您的问题或提出新的问题。
class Plastic
  MELTING_POINT = 125

  attr_accessor :temperature, :state

  def initialize(room_temp)
    @temperature = room_temp
  end

  def inc_temperature
    @temperature += 50
  end

  def state
    @temperature >= Plastic::MELTING_POINT ? :liquid : :solid
  end
end