无法将实例变量的值从同一类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

或使用类方法创建一个计数器,然后尝试将其链接到实例(尽管这很长)

实际上,对于初学者来说,了解可变范围是一项真正的斗争。无论如何,对于回答我问题的任何人都非常感谢。谢谢!

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...