我在文件“ 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
变量。我在从类外部访问类实例变量时遇到问题。谁能给我一个解释吗?
答案 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
我希望我能给你个感觉。