2017-01-23 10 views
1

ハッシュの配列を繰り返し処理し、その値を端末に出力したいと考えています。現在、エラーを受信Ruby - ハッシュの配列 - 未定義のメソッド 'each'エラー

main.rb:14:in `print': undefined method `each' for nil:NilClass (NoMethodError) 
from main.rb:22:in `<main>' 

を私はputs @transactions

のような単純なものとは反対に、任意のアイデアを反復処理したいんだが、なぜ私はこのエラーを受けていますか?それはインスタンス変数として初期化されていないためおかげ

class TestRun 
    @transactions = [ 
     {:repayment_number => 1, :repayment_amount => 224.34}, 
     {:repayment_number => 2, :repayment_amount => 241.50}, 
     {:repayment_number => 3, :repayment_amount => 135.04}, 
     {:repayment_number => 4, :repayment_amount => 91.00} 
    ] 

    def print() 
     @transactions.each do |t| 
     puts "#{t[:repayment_number]} - #{t[:repayment_amount]}" 
     end 
    end 

end 

@test = TestRun.new 
@test.print() 
+1

'@トランザクション 'は、' TestRun'のインスタンスではなく、 'TestRun'固有クラスで定義されています。 – cobaltsoda

答えて

2

@transactionsnilです。 initializeメソッドを使用して、クラスオブジェクトの作成時にこのメソッドを作成できます。

これを活用するには、コードを修正する必要があります。

class TestRun 
    def initialize 
    @transactions = [ 
     {:repayment_number => 1, :repayment_amount => 224.34}, 
     {:repayment_number => 2, :repayment_amount => 241.50}, 
     {:repayment_number => 3, :repayment_amount => 135.04}, 
     {:repayment_number => 4, :repayment_amount => 91.00} 
    ] 
    end 

    def print() 
     @transactions.each do |t| 
     puts "#{t[:repayment_number]} - #{t[:repayment_amount]}" 
     end 
    end 

end 

@test = TestRun.new 
@test.print() 
+1

"' initialize'メソッドは、クラスのインスタンス変数を初期化するために使用されます。 " - それはそのために使用されるかもしれませんが、最初の目的はこれからはありません。 – mudasobwa

+0

@mudasobwa合意。私が言及したことはそれを行う一つの方法です。 ** Cary Swoveland **の答えははるかに説明的です。 – 31piy

+0

@mudasobwaそう、初期化の目的は何ですか? – Stefan

5

selfクラスインスタンス変数作り、TestRunに等しいときは、その後、selfが1つのインスタンス変数ことを作り、インスタンスTestRun.newあるprint方法、内、最初に、二回@transactionsを定義しています。これら2つの変数は、@night@dayと異なります。

コードを機能させるための3つの方法があります(最初の2つは教育目的のみ)。

ください印刷それを作るクラスメソッド

class TestRun 
    puts "self at class level = #{self}" 
    @transactions = [ 
    {:repayment_number => 1, :repayment_amount => 224.34}, 
    {:repayment_number => 2, :repayment_amount => 241.50} 
    ] 
    def self.print 
    puts "self within self.print = #{self}" 
    @transactions.each do |t| 
     puts "#{t[:repayment_number]} - #{t[:repayment_amount]}" 
    end 
    end 
end 
    #=> self at class level = TestRun 
TestRun.print 
    #=> self within self.print = TestRun 
    # 1 - 224.34 
    # 2 - 241.5 

アクセス

class TestRun 
    @transactions = [ 
    {:repayment_number => 1, :repayment_amount => 224.34}, 
    {:repayment_number => 2, :repayment_amount => 241.50} 
    ] 
    def print 
    puts "self within print = #{self}" 
    self.class.instance_variable_get(:@transactions).each do |t| 
     puts "#{t[:repayment_number]} - #{t[:repayment_amount]}" 
    end 
    end 
end 

TestRun.new.print 
    #=> self within print = #<TestRun:0x007fcccb13f390> 
    # 1 - 224.34 
    # 2 - 241.5 

はinitializeメソッド内@transactionsを定義する方法のプリントの中からクラスのインスタンス変数、インスタンス変数

これは@ 31piyが行ったことであり、おそらくOPによって意図されているものです。

class TestRun 
    def initialize 
    puts "self within initialize = #{self}"  
    @transactions = [ 
     {:repayment_number => 1, :repayment_amount => 224.34}, 
     {:repayment_number => 2, :repayment_amount => 241.50} 
    ] 
    end 
    def print 
    puts "self within print = #{self}" 
    @transactions.each do |t| 
     puts "#{t[:repayment_number]} - #{t[:repayment_amount]}" 
    end 
    end 
end 

TestRun.new.print 
    #=> self within initialize = #<TestRun:0x007fcccb2ae988> 
    # self within print = #<TestRun:0x007fcccb2ae988> 
    # 1 - 224.34 
    # 2 - 241.5 
+0

@ 31piyの答えは間違った言葉遣いをしていて、一般的には「他人が通常どのようにしているか」を盲目的に示しています。 Upvoted、もちろん。 – mudasobwa

関連する問題