为什么我不能追加数组呢?

时间:2013-09-30 17:42:15

标签: ruby arrays append

如果它是一个回文,我想将用户输入添加到数组中。我一直在说:

undefined method `<<' for nil:NilClass

我跑的时候。

最终我想要比较所有值并找到最高值,这就是我在那里有课程的原因。

class Palindrome
  attr_accessor :palindrome_array
  @palindrome_array = []

  def check_palindromic(variable)

    if variable.reverse == variable
      @palindrome_array << variable
    end
  end
end

a = Palindrome.new
puts "Enter a number"
i = gets.chomp()
a.check_palindromic(i)

我一直在摸不着头脑。有人能告诉我缺少什么吗?

2 个答案:

答案 0 :(得分:0)

因为您的对象a没有实例变量@palindrome_array,所以您认为它具有。你需要这样做:

a = Palindrome.new
a.palindrome_array=[]
puts "Enter a number"
i = gets.chomp()
a.check_palindromic(i)

从此代码中删除@palindrome_array = [],因为它具有不同的含义:

class Palindrome
  attr_accessor :palindrome_array
  @palindrome_array = []

这是另外的解释:

class Palindrome
  attr_accessor :palindrome_array
  @palindrome_array = []
    def check_palindromic(variable)
         if variable.reverse == variable
            @palindrome_array << variable
         end
    end
 end  

a = Palindrome.new
Palindrome.instance_variables # => [:@palindrome_array]
a.instance_variables # => []
a.palindrome_array=[]
a.instance_variables # => [:@palindrome_array]
  

我不断得到“未定义的方法”&lt;&lt;&lt;对于nil:NilClass“当我运行它时。

姆。发生这种情况是因为在@palindrome_array下面定义的Palindrome是属于类对象的实例变量。请注意,这与类变量不同,并且不能称为@@palindrome_array,而@palindrome_array方法中定义的check_palindromic是属于{{1}的实例的实例变量}。它们是两个不同的变量,第一个只能在类方法中访问。

答案 1 :(得分:0)

您需要在类构造函数中初始化所有实例变量:

class Palindrome
   ...
   def initialize 
      @palindome_array = []
   end
   ...
end

当前的方式,你在 class 级别声明一个实例变量(这是有效的,因为所有类都继承自Class)