【问题标题】:Accidental NilClass in my instance variables [closed]我的实例变量中的意外 NilClass [关闭]
【发布时间】:2014-02-20 15:57:35
【问题描述】:

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

所以我认为最简单的方法是让每个角色都有一个单独的班级来记录他们对其他人的感受。下面是一个这样的示例类。我还认为,跟踪应在何处添加点的最简单方法是给每个字符一个指向其自己变量的哈希,然后使用交换函数与他们正在与之交谈的人交换目标。

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

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 方法(或任何方法,真的)时,我收到错误消息 undefined method '[]' for nil class。

如何阻止我的实例变量成为 nil 类?我怎样才能成功地制作将添加到特定字符数组中的一个变量的方法?有没有人对我如何指定目标对象有更好的想法?

【问题讨论】:

  • 这个问题似乎离题了,因为它显示了如此糟糕的代码结构,以至于答案对其他人几乎没有用处。

标签: ruby arrays class undefined null


【解决方案1】:

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

类外的@krelat与类内的@krelat完全无关。

makehappy 方法不起作用,因为{ @target => @hrelat } 在 Ruby 中没有做任何事情(嗯,它使用指向 nil 值的 nil 键创建散列,然后丢弃该散列。即. 实际上什么都没有。

这段代码一团糟,先学习 Ruby。购买“Programming Ruby”并阅读它。

【讨论】:

    【解决方案2】:

    你是说:

    hfeels=HRelatStatus.new
    puts @krelat.class
    

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

    (当然,that 也不起作用,因为您已将访问器生成器隐藏在实例方法中。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 2020-04-05
      • 1970-01-01
      • 2011-10-07
      • 2013-05-13
      相关资源
      最近更新 更多