doc*_*hat 22 ruby inheritance class class-variables
ruby类实例的东西让我很头疼.我明白了......
class Foo
  @var = 'bar'
end
Run Code Online (Sandbox Code Playgroud)
...这@var是创建的类的实例上的变量.
但是如何创建子类可覆盖的类变量?
这是我在Python中做的一个例子:
class Fish:
var = 'fish'
def v(self):
    return self.var
class Trout(Fish):
    var = 'trout'
class Salmon(Fish):
    var = 'salmon'
print Trout().v()
print Salmon().v()
Run Code Online (Sandbox Code Playgroud)
哪个输出:
trout
salmon
Run Code Online (Sandbox Code Playgroud)
我如何在ruby中做同样的事情?
gle*_*man 21
为了对比@ khelll的答案,它使用Class对象上的实例变量:
class Fish
  # an instance variable of this Class object
  @var = 'fish'
  # the "getter"
  def self.v
    @var
  end
  # the "setter"
  def self.v=(a_fish)
    @var = a_fish
  end
end
class Trout < Fish
  self.v = 'trout'
end
class Salmon < Fish
  self.v = 'salmon'
end
p Trout.v   # => "trout"
p Salmon.v  # => "salmon"
Run Code Online (Sandbox Code Playgroud)
编辑:为实例提供对类的实例变量的读访问权:
class Fish
  def type_of_fish
    self.class.v
  end
end
p Trout.new.type_of_fish   # => "trout"
p Salmon.new.type_of_fish  # => "salmon"
Run Code Online (Sandbox Code Playgroud)
        @var上面提到的被称为类实例变量,它与实例变量不同...在这里阅读答案以查看差异.
无论如何,这是相当的Ruby代码:
class Fish
  def initialize
    @var = 'fish'
  end
  def v
    @var
  end
end
class Trout < Fish
  def initialize
    @var = 'trout' 
  end
end
class Salmon < Fish
  def initialize
    @var = 'salmon' 
  end
end
puts Trout.new.v
puts Salmon.new.v
Run Code Online (Sandbox Code Playgroud)