Ruby类变量

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)


khe*_*lll 8

@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)