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