如何解决无法将实例变量的值从同一类Ruby内部传递给另一个变量
这是我的代码。
class Dog
attr_accessor :name
attr_reader :breed,:age
def initialize(name,breed,age)
@name = name
@breed = breed
@age = age
@distance_in_kms = []
end
def walk(distance_in_kms)
@distance_in_kms << {distance: distance_in_kms}
end
def walked_distance
@walked_distance = @distance_in_kms.inject(0) {|sum,hash| sum + hash[:distance]}
end
def display_walks
puts "#{@name} has had #{@distance_in_kms.length} walks and walked #{@walked_distance} kms today:"
@distance_in_kms.each do |each_walk|
puts "#{each_walk[:distance]} km"
end
end
#overriding to_s to print a meaningful representation of a class
def to_s
return "Dog: breed-#{@breed} name-#{@name}"
end
end
doggo = Dog.new("Roy","Labrador",8)
doggo.walk(3)
doggo.walk(5)
doggo.walk(1)
puts doggo.name = "Dang"
puts doggo.breed
doggo.display_walks
我得到的结果是这个
Dang
Labrador
Dang has had 3 walks and walked kms today:
3 km
5 km
1 km
kms之前的期望值应为9,即一天中每次行走的总和。显然,我使用walked_distance
方法做错了。我试图将数组@distance_in_kms
的值传递到@walked_distance
中,但是没有用,返回值为nil。但是我该怎么做才能解决问题并获得预期的结果?谢谢!!
解决方法
puts "#{@name} has had #{@distance_in_kms.length} walks and walked #{@walked_distance} kms today:"
但是您永远不会调用代码来计算@walked_distance
。在您添加新的步行路线时对其进行更新,或者在此处计算总距离(例如,通过致电walked_distance
)
您必须调用方法来更新@walked_distance
,例如:
def display_walks
walked_distance # <------ This line
puts "#{@name} has had #{@distance_in_kms.length} walks and walked #{@walked_distance} kms today:"
@distance_in_kms.each do |each_walk|
puts "#{each_walk[:distance]} km"
end
end
或更改walked_distance
方法并直接从字符串插值中调用它:
def walked_distance
@distance_in_kms.inject(0) {|sum,hash| sum + hash[:distance]}
end
def display_walks
puts "#{@name} has had #{@distance_in_kms.length} walks and walked #{walked_distance} kms today:"
@distance_in_kms.each do |each_walk|
puts "#{each_walk[:distance]} km"
end
end
脱离主题,仅需更改一下即可进行评估:
@walked_distance = @distance_in_kms.values.sum
,
我也可以在一开始就做到这一点:
class Dog
attr_accessor :name
attr_reader :breed,:age
def initialize(name,breed,age)
@name = name
@breed = breed
@age = age
@distance_in_kms = []
@walked_distance = []
end
def walk(distance_in_kms)
@distance_in_kms << {distance: distance_in_kms}
@walked_distance = @distance_in_kms.inject(0) {|sum,hash| sum + hash[:distance]}
end
def display_walks
puts "#{@name} has had #{@distance_in_kms.length} walks and walked #{@walked_distance} kms today:"
@distance_in_kms.each do |each_walk|
puts "#{each_walk[:distance]} km"
end
end
#overriding to_s to print a meaningful representation of a class
def to_s
return "Dog: breed-#{@breed} name-#{@name}"
end
end
doggo = Dog.new("Roy","Labrador",8)
doggo.walk(3)
doggo.walk(5)
doggo.walk(1)
puts doggo.name = "Dang"
puts doggo.breed
doggo.display_walks
或使用类方法创建一个计数器,然后尝试将其链接到实例(尽管这很长)
实际上,对于初学者来说,了解可变范围是一项真正的斗争。无论如何,对于回答我问题的任何人都非常感谢。谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。