继承类时,我想将类变量保存到继承类而不是父类......就像这样......
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
这是一个人为的例子,因为在玩弄它之后,我更想要了解它。
答案 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
类变量是一个共享变量。 Baz
,Bar
和Foo
都使用相同的类变量@@title
。完成class Baz < Foo ;end
后,@@title
已更新为Baz
的名称,因此对getter方法#title
的所有调用都会提供变量{{的当前更新值1}}。
请遵循以下代码: -
@title
答案 1 :(得分:0)
您可以使用Module#class_variable_get和Module#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