0

这是代码:

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呢?

这有任何意义吗?

4

2 回答 2

1

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

def player
  @player
end

def player=(player)
  @player = player
end

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

于 2014-02-13T23:35:44.563 回答
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"

对于大多数人来说,符号版本只是“读起来更好”。

于 2014-02-13T23:36:30.000 回答