2014-11-25 101 views
-1
class Player 
    include Playable 

    attr_reader :points 
    attr_accessor :health, :name 

    def initialize(name, health=100, points=0) 
     @name      = name.capitalize 
     @health      = health 
     @found_treasures = Hash.new(0) 
     @points      = points 
    end 
    end 

module Playable 

    def blam 
     self.health -= 10 
     puts "#{name} just got blammed yo." 
    end 

    def w00t 
     self.health += 15 
     puts "\n#{name} just got w00ted." 
    end 

    def score 
     self.health + points 
    end 

    def strong? 
     health > 100 
    end 


end 

所以在上面的代码中的实例方法中,我明白的是,为了设置属性的健康,它需要1)是在类的存取方法,我包括模块in和2)它需要模块中的自我。红宝石自我在模块

在这种情况下,自我指的是什么?由于模块中的方法是实例方法,因此需要在对象上调用它们,所以self指向Player类的实例?如果这是正确的,那么self.health指的是一个attr_accessor方法,这段代码很有意义。没有“自我”这个词,它会是一个局部变量赋值是否正确?这是什么?

+0

不,“健康”和“self.health”一样是对访问者的调用。尽管如此,“self.health”更加明确和可读。 – Amadan 2014-11-25 06:48:21

回答

-1

attr_accessor只是一个Module的方法。根据文件,它(几乎:信用@JörgWMittag)创建一个实例变量和两个getter方法health和setter方法health=(是否要创建的getter/setter仅分别使用attr_readerattr_writer。)

当Ruby解释器找到一个新名称时,它会尝试使用此名称创建新本地变量,然后再解析它。一旦吸气剂被定义,它就会被使用。

直到你得到了health(定义明确或在attr_getter/attr_accesor的帮助下),这段代码将创建具有该名称的本地变量。

希望它能通过。

+0

这是错误的。 'attr_accessor'不会创建一个实例变量。分配给实例变量会创建一个实例变量。在创建任何实例之前,如何在类定义时执行它时甚至会创建一个实例变量?* * * * attr_accessor *另外,局部变量会影响方法,而不是相反。你是否有吸气没关系。 – 2014-11-25 14:48:55

+0

@JörgWMittag我更正了关于实例变量的措辞,谢谢。我从来没有说方法会影响局部变量:“找到一个**新的**名称,它会在创建新的局部变量之前尝试解析它。” – mudasobwa 2014-11-25 15:35:41