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)
你定义了@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)
| 归档时间: |
|
| 查看次数: |
509 次 |
| 最近记录: |