初始化数组会创建一个nil对象吗?

时间:2015-10-26 21:46:38

标签: arrays ruby null

我正在创建一个新的

@array = Array.new

我随后想要使用一个将元素推送到数组

的函数
@array << object

但我得到了

NoMethodError: undefined method `push' for nil:NilClass

错误。

有人可以帮我理解这种行为吗?

这里有一些上下文中的代码

class Hand #abstract
@values_of_cards = Hash.new()
@cards_in_hand = ['']
@hand_size = 0
@minmax = @values_of_cards.minmax {|a, b| a.value <=> b.value}

def add_card(card)
  if @cards_in_hand == nil || (@cards_in_hand.length < @hand_size && !contains?(card))
   @cards_in_hand.push(card)
  end
end

这里&#39; card&#39;是在单独的类中定义的对象。

2 个答案:

答案 0 :(得分:3)

class MyClass
  @some_variable
  def some_method
    @some_variable
  end
end
第2行的

@some_variable引用实例变量,而第4行的@some_variable引用实例变量。它们完全 不同。在类本身的上下文中访问的实例变量称为类实例变量。在实例方法的上下文中访问的实例变量只是常规实例变量。

您班级的前四行是设置 class 实例变量,完全 不同 实例变量

看起来您尝试为多个实例变量设置初始值。要做到这一点,你需要在initialize方法中包含前四行,如下所示:

def initialize
  @values_of_cards = Hash.new()
  @cards_in_hand = ['']
  @hand_size = 0
  @minmax = @values_of_cards.minmax {|a, b| a.value <=> b.value}
end

注意:写成@minmax的最后一行是在没有元素的哈希上运行,所以它并没有真正做太多。如果散列 具有元素,则minmax代码将因超出此问题范围的原因而失败。

答案 1 :(得分:0)

我通过将变量从@variable更改为@@ variable

来解决了这个问题