从另一个类访问类实例变量

时间:2019-02-13 20:07:00

标签: ruby

我在文件“ ghost.rb”中有此类:

class Ghost
  attr_accessor :fragment

  def initialize(number_of_players)
    @fragment = ''
  end
end

我正在尝试从同一目录中的另一个文件访问@fragment。下面是同一目录中的“ aiplayer.rb”。

require "./ghost"

class Aiplayer
  attr_reader :aiplayer

  def initialize
    @aiplayer = Player.new('AI Player')
  end

  def fragment_printer
    Ghost.fragment
  end
end

当我初始化Aiplayer的实例并对其调用fragment_printer方法时,出现以下错误:

NoMethodError: undefined method `fragment' for Ghost:Class
from aiplayer.rb:17:in `fragment_printer'

我在那里有attr_accessor,所以我不确定为什么不能从fragment类的外部访问Ghost变量。我在从类外部访问类实例变量时遇到问题。谁能给我一个解释吗?

2 个答案:

答案 0 :(得分:1)

要链接实例,您可以在初始化时将Ghost实例传递到Aiplayer实例中。

class Aiplayer
  attr_accessor :ghost

  def initialize(ghost_to_attach)
    self.ghost = ghost_to_attach
  end

  def fragment_printer
    ghost.fragment
  end

end

x = Ghost.new
y = Aiplayer.new(x)

x.fragment = 'foo'

y.fragment_printer
=> "foo"

之所以可行,是因为存储在变量x中的对象与存储在Aiplayer实例ghost属性中的对象相同。

答案 1 :(得分:1)

  

有人可以给我快速解释一下吗?我相信解释很简单,但是我似乎找不到答案。

您写了features = { ... 'map': tf.FixedLenFeature([x, y, z], dtype=tf.float32) ... } parsed_example = tf.parse_single_example(serialized=serialized, features=features) map = parsed_example['map'] -这不是实例方法,而是类方法。

类方法与对象无关。您可以阅读about this

Ruby在Ghost.fragment类中搜索方法self.fragment,但找不到它。

Ghost

这就是您遇到问题的原因。

进一步取决于您想要什么。例如,您可以编写NoMethodError: undefined method `fragment' for Ghost:Class 。在这种情况下,Ghost.new(5).fragment是返回#fragment

的实例方法

我希望我能给你个感觉。