一个略复杂的例子:
class Unit # 定义一个类 作战单位 attr_accessor :name # 名字和生命值 attr_accessor :hp def initialize(name) # 实例初始化 确定名字 @name = name @hp = 100 end def alive # 判定是否存活 @hp > 0 end def attack(aim) # 攻击 return if !alive if !aim.alive puts "It's dead." return end aim.attacked(45) # 敌方被攻击 puts "#{self} damaged #{aim.inspect}!" if !aim.alive ###################################################################################### kill(aim) # 如果 敌方死亡 显示文字 else # 否则 # 调用敌方的 attack 其中用到了参数 self aim.attack(self) # 如果 self 指的是 aim 就会导致敌人攻击自己 # 但实际上敌人会攻击这个对象 end # 因为 self 是在这个类中 永远指作为调用者的这个类的实例 end # 在下面可以看到 调用者首先是 hero 此时 self 指hero 当hero调用了monster的attack时 def attacked(damage) # 在monster的过程中 self 又指monster @hp -= damage ################################################################################### end def kill(aim) puts "\n +=+=+= #{self} killed #{aim}! =+=+=+" end def to_s # 使名称能被显示 这个方法会在puts中自动调用 @name end end hero = Unit.new("Hero") # 创建单位 monster = Unit.new("Monster") puts " --- Battle Start --- " # 战斗开始 hero.attack(monster) # hero 首先攻击 按照上面的算法 hero会赢 puts "\n --- #{hero.alive ? hero : monster} wins! ---"
class Unit # 定义一个类 作战单位
attr_accessor :name # 名字和生命值
attr_accessor :hp
def initialize(name) # 实例初始化 确定名字
@name = name
@hp = 100
end
def alive # 判定是否存活
@hp > 0
end
def attack(aim) # 攻击
return if !alive
if !aim.alive
puts "It's dead."
return
end
aim.attacked(45) # 敌方被攻击
puts "#{self} damaged #{aim.inspect}!"
if !aim.alive ######################################################################################
kill(aim) # 如果 敌方死亡 显示文字
else # 否则
# 调用敌方的 attack 其中用到了参数 self
aim.attack(self) # 如果 self 指的是 aim 就会导致敌人攻击自己
# 但实际上敌人会攻击这个对象
end # 因为 self 是在这个类中 永远指作为调用者的这个类的实例
end # 在下面可以看到 调用者首先是 hero 此时 self 指hero 当hero调用了monster的attack时
def attacked(damage) # 在monster的过程中 self 又指monster
@hp -= damage ###################################################################################
end
def kill(aim)
puts "\n +=+=+= #{self} killed #{aim}! =+=+=+"
end
def to_s # 使名称能被显示 这个方法会在puts中自动调用
@name
end
end
hero = Unit.new("Hero") # 创建单位
monster = Unit.new("Monster")
puts " --- Battle Start --- " # 战斗开始
hero.attack(monster) # hero 首先攻击 按照上面的算法 hero会赢
puts "\n --- #{hero.alive ? hero : monster} wins! ---"
结果
--- Battle Start ---
Hero damaged Monster!
Monster damaged Hero!
Hero damaged Monster!
Monster damaged Hero!
Hero damaged Monster!
+=+=+= Hero killed Monster! =+=+=+
--- Hero wins! --- |