attr_accessor如何知道:player = @player?

时间:2014-02-13 23:25:57

标签: ruby instance instance-variables attr-accessor

以下是代码:

class Dungeon   
  attr_accessor :player 
    def initialize(player_name)   
    @player = Player.new(player_name)   
    end 
end

现在,如果我写:

dungeon = Dungeon.new("Robert")
puts dungeon.player.name

显然会吐出Robert

我对Ruby有点新鲜,所以如果这个问题对你们所有人都很明显,请原谅我。我仍然在努力绕过它。我正在学习“实例”,“类”和全局变量,我的问题是:Ruby如何知道上面代码中的:player是指@player?为什么不编写代码:@player

这有意义吗?

2 个答案:

答案 0 :(得分:1)

attr_accessor只是一种定义公共getter / setter的方法。 @player是存储值的实际实例变量。它生成的getter基于符号名称,因此:player创建了这些方法:

def player
  @player
end

def player=(player)
  @player = player
end

如果您只想要吸气剂,可以使用attr_reader。如果您只想要设置器,则可以使用attr_writerattr_accessor结合了这两种方法,并为您提供了两种方法。

答案 1 :(得分:1)

首次学习Ruby时容易忽略的一点是构造

attr_accessor :property_name

只是为类的实例变量编写getter和setter方法的一种较短方法:

# getter
def property_name
  @property_name
end

# setter
def property_name=( some_value )
  @property_name = some_value
end

它基本上是Ruby中“元编程”支持的一个例子,但它感觉更像是一些神秘的东西。

此外,您不必使用符号样式,而是可以使用:

attr_accessor "property_name"

符号版本对大多数人来说“读得更好”。