1

回文の場合、配列にユーザー入力を追加したい。私は得続けます:

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)

私はこれについて頭を悩ませてきました。何が足りないのか教えてもらえますか?

4

2 に答える 2

0

クラス コンストラクターですべてのインスタンス変数を初期化する必要があります。

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

現在の方法では、クラスレベルでインスタンス変数を宣言しています(これは、すべてのクラスが Class から継承されるため機能します)。

于 2013-09-30T17:45:49.723 に答える
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]

実行すると、「nil:NilClass の未定義メソッド `<<'」が表示され続けます。

うーん。これは、@palindrome_arrayクラスの下に定義されPalindromeているのは、クラス オブジェクトに属するインスタンス変数であるためです。これはクラス変数と同じではなく、 として参照できないことに注意してください@@palindrome_array。一方@palindrome_array、メソッド内で定義されているのcheck_palindromicは のインスタンスに属するインスタンス変数ですPalindrome。これらは 2 つの異なる変数であり、最初の変数はクラス メソッドでのみアクセスできます。

于 2013-09-30T17:43:59.110 に答える