为什么说在ruby实例中,方法是由子类继承而不是超类的实例变量? 从代码中可以清楚地看到@order是一个实例变量 ruby由子类方法Price_demand
继承class Management
def price
@OrderNo=4
@Order =4
puts "the price of order #{@OrderNo.to_s} is $40"
end
def exe
puts "print #{@Order.to_s}"
end
def rant
puts "please hurry with the order"
end
end
class Waiter < Management
def Price_demand
puts "the price of #{@Order.to_s} is $5"
end
end
a=Waiter.new
a.price
a.exe
a.Price_demand
puts a.instance_variables
答案 0 :(得分:1)
实例变量在通过赋值初始化之前不会存在。无论该类是否继承,都是如此。例如,对于父类Management
,观察到以下
m = Management.new
p m.instance_variables
#=> []
m.price
p m.instance_variables
#=> [:@OrderNo, :@Order]
将这与继承相关似乎令人困惑,我想说“Head First Ruby”一书的作者在本书的那一部分中不必要地混淆了读者。
如果Management
类中的构造函数将实例变量初始化为用户提供的或默认值,那么,您会看到在instance_variables
方法的响应中列出的那些实例变量。
答案 1 :(得分:1)
子类或超类没有实例变量。实例变量是实例的属性,而不是类。这就是为什么他们被称为&#34;实例&#34;毕竟是变量!
一旦理解了这一点,您的代码就会变得清晰:实例变量属于a
。修改它的方法在哪里定义并不重要。
[注意:显然,类也是实例(类Class
),所以它们可以有自己的实例变量,但这不是我们在这里讨论的。]