我正在创建一个新的
@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;是在单独的类中定义的对象。
答案 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
来解决了这个问题