繁体   English   中英

类方法上实例变量的范围

[英]Scope of instance variable on class methods

我正在尝试使以下代码起作用。

class Animal

end

class Tiger < Animal
    @hunger = 100

    def self.hunger
        @hunger 
    end

    def run
        puts "The Tiger runs"
        @hunger += 10
    end
end

class Statistics
    puts "This tigers hunger is: #{Tiger.hunger}" 
end

tiger = Tiger.new()
tiger.run

因此,老虎有一个名为“ hunger的变量,它本身就是Tiger类中的Tiger 我想这样做,以便可以在整个类方法中更改此变量。 例如,在run将饥饿设置为hunger += 10 ,但是当我运行此代码时,我得到了undefined method '+' for nil:NilClass (NoMethodError)undefined method '+' for nil:NilClass (NoMethodError) 我该怎么做才能使该程序正常工作,以便可以更改变量,然后将其显示在Statistics类中?

问题是您将类和实例变量/方法完全忽略了。

如果要使用实例(应使用):

class Animal; end

class Tiger < Animal
  attr_reader :hunger

  def initialize
    @hunger = 100
  end

  def run
    puts "The Tiger runs"
    @hunger += 10
  end
end

class Statistics
  def self.show(tiger)
    puts "This tigers hunger is: #{tiger.hunger}" 
  end
end

tiger = Tiger.new
tiger.run
Statistics.show(tiger)

如果要使用类方法/变量:

class Animal; end

class Tiger < Animal
  @hunger = 100

  def self.hunger
    @hunger
  end

  def self.run
    puts "The Tiger runs"
    @hunger += 10
  end
end

class Statistics
  def self.show
    puts "This tigers hunger is: #{Tiger.hunger}" 
  end
end

Tiger.run
Statistics.show

请注意, @hunger现在是Tiger的类实例变量。 类实例变量和类变量(用@@定义的变量)之间的区别在于,后者由所述类的所有后代共享,而前者仅与定义它的类绑定。

不过,无论哪种情况,我都不同意您对Statistic

在Tiger类中,您不需要初始化方法吗?

def initialize()
@hunger = 100
end

我对您的统计课感到困惑。 这不是Tiger类中的方法吗? 它怎么知道要访问哪些Tiger? 如果要这样做,我会添加一个以老虎为参数的方法。

class Statistics
def tiger_stat(tiger_name)
puts "This tigers hunger is: #{tiger_name.hunger}" 
end
end

编辑*这是我将使用的代码:

class Animal
    def initialize(animal_type, hunger_start)
        @animal_type = animal_type
        @hunger = hunger_start
    end

    def hunger_print
        puts "This #{@animal_type}'s hunger is: #{@hunger}."
    end
end

class Tiger < Animal
    def initialize
        super("Tiger", 100)
    end

    def run
        puts "The Tiger runs"
        @hunger += 10
    end
end

这样,您可以在任何动物上调用hunger_print,而不必担心类型或制作额外的类。 你可以做类似的事情。

tiger = Tiger.new
tiger.run
tiger.hunger_print

您可以使用可以从实例方法和类方法访问的类变量。

class Animal
  @@hunger = 100

  def self.hunger
    @@hunger
  end

  def self.increase_hunger
    @@hunger +=1
  end

  def hunger
    @@hunger
  end

  def increase_hunger
    @@hunger += 1
  end
end

Animal.increase_hunger
puts Animal.hunger # => 101
animal = Animal.new
animal.increase_hunger
puts animal.hunger # => 102

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM