为继承的类分配类变量

时间:2014-04-07 18:02:51

标签: ruby

继承类时,我想将类变量保存到继承类而不是父类......就像这样......

class Foo
  def self.inherited klass
    klass.title = klass.to_s
  end

  def self.title= title
    @@title = title
  end

  def self.title
    @@title
  end
end

class Bar < Foo
end

class Baz < Foo
end

Bar.title # returns `Baz` instead of `Bar`
Baz.title

这是一个人为的例子,因为在玩弄它之后,我更想要了解它。

2 个答案:

答案 0 :(得分:1)

您需要将类变量更改为实例变量。

class Foo
  def self.inherited klass
    klass.title = klass.to_s
  end

  def self.title= title
    @title = title
  end

  def self.title
    @title
  end
end

class Bar < Foo
end

class Baz < Foo
end

Bar.title  # => "Bar"
Baz.title # => "Baz"

@@title类变量是一个共享变量。 BazBarFoo都使用相同的类变量@@title。完成class Baz < Foo ;end后,@@title已更新为Baz的名称,因此对getter方法#title的所有调用都会提供变量{{的当前更新值1}}。

请遵循以下代码: -

@title

答案 1 :(得分:0)

您可以使用Module#class_variable_getModule#class_variable_set

来实现
class Foo
  def self.title= title
    class_variable_set(:@@title, title)
  end
  def self.title
    class_variable_get(:@@title)
  end
end

class Bar < Foo
end

class Baz < Foo
end

Bar.title = 'Bar'
Baz.title = 'Baz'

Bar.title           #=> "Bar"
Bar.title = "Cat"

Baz.title           #=> "Baz"

Bar.class_variables #=> [:@@title]
Baz.class_variables #=> [:@@title]
Foo.class_variables #=> []

Foo.methods(false) #=> [:title=, :title]
Bar.methods(false) #=> []
Baz.methods(false) #=> []

如果我们要在其设定者之前执行Bar一个吸气剂,我们就会得到:

Bar.title #=> NameError: uninitialized class variable @@title in Bar

如果需要,可以通过在类定义中添加以下内容来初始化类变量(比如nil

def self.inherited klass
  klass.class_variable_set(:@@title, nil)
end