Ruby - 哈希数组 - 未定义的方法'每个'错误

1 ruby arrays hash ruby-on-rails

我想迭代哈希数组并将值打印到终端.

目前收到错误:

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

我想要迭代,而不是简单的事情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()
Run Code Online (Sandbox Code Playgroud)

Car*_*and 5

你定义了@transactions两次,最初是self等于TestRun,使它成为一个类实例变量,然后在print方法中,什么时候self是实例TestRun.new,使那一个成为一个实例变量.这两个变量是根据不同的@night@day.

以下是使代码工作的三种方法(前两种仅用于教育目的).

使打印成为一种类方法

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
Run Code Online (Sandbox Code Playgroud)

从方法print中访问类实例变量

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
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)