我的实例变量中的意外NilClass

时间:2014-01-29 02:44:55

标签: ruby arrays class undefined null

我正在制作一个约会模拟器。我需要的第一件事就是跟踪角色对彼此的感受。在这个模拟游戏中,任何人都可以与其他任何人约会,并且关系有两个变量(一个用于爱,一个用于友谊)。

所以我认为最简单的方法就是让每个角色都有一个独立的班级来跟踪他们对其他人的感受。下面是一个这样的样本类。我还认为跟踪应该添加点的最简单方法是给每个角色一个指向自己变量的哈希值,然后使用交换函数将目标与他们说话的人进行交易。

但是,我收到一条错误消息。

class HRelatStatus
  def initialize
   {@target=> @hrelat}
   @krelat =[10, 10]
   @arelat =[9, 4]
   @srelat =[13, 11]
   @jrelat =[12, 1]
   @brelat =[5, 5]
   @hrelat=[0, 0]
  end
   def dataaccess
    attr_accessor :target, :krelat, :arelat, :srelat, :jrelat, :brelat, :hrelat
  end
  def makehappy
    @target[0] = @target[0]+1  
  end  
end

hfeels=HRelatStatus.new
puts @krelat.class
puts @krelat[1]
hfeels.makehappy
puts @target[0]

当我尝试运行时,@ krelat作为Nil类返回。当我尝试运行makehappy方法(或任何方法,真的)时,我得到nil类的错误消息undefined method'[]'。

如何阻止我的实例变量成为nil类?我如何成功地创建将为特定字符添加到数组中的一个变量的方法?有没有人对如何指定目标对象有更好的了解?

2 个答案:

答案 0 :(得分:1)

你在说:

hfeels=HRelatStatus.new
puts @krelat.class

但在这种情况下,没有@krelat这样的东西。你所追求的是你的实例中的krelat实例变量,即hfeels.krelat

(当然, 无法正常工作,因为您已将访问者生成器隐藏在实例方法中。)

答案 1 :(得分:0)

您实际需要做的第一件事是了解Ruby(或任何语言中的变量范围)是如何工作的。

课堂外的

@krelat与班级内的@krelat完全无关。

makehappy方法不起作用,因为{ @target => @hrelat }在Ruby中没有做任何事情(好吧,它会创建一个哈希,其中nil键指向nil价值,然后丢弃哈希。即实际上没有。

此代码完全混乱,首先学习Ruby。购买“编程Ruby”并阅读它。