[英]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.