我想知道是否可以使用attr_accessor
来引用名称与其定义的方法不同的属性。例如,我有一个带有属性GameWindow
的类bg_color
,并且我想attr_accessor
定义方法background
和background=
。有什么方法可以做,还是我必须自己定义方法?
答案 0 :(得分:2)
您希望attr_accessor定义方法background和background =。 attr_accessor用于定义实例的getter和setter,变量&method是返回值的东西,但您不能像method的background =那样使用setter。
请与alias_attribute和alias_method进行确认。
答案 1 :(得分:1)
attr_accessor
creates the instance variable(此处为@bg_color
;或更精确地说,可以调用该对象,尽管正如Cary和Jörg在下面指出的那样,实例变量不是严格创建,直到被分配为止)以及以您使用的符号参数命名的读写器方法。如果您希望将其命名为background
,为什么不直接更改名称呢?
答案 2 :(得分:1)
attr_accessor :background
只是一个简单的宏,可以为您生成以下两种方法:
def background
@background
end
def background=(value)
@background = value
end
当您要使用特定名称的getter和setter方法但将值分配给具有不同名称的变量时,只需自己编写方法-例如:
def background
@bg_color
end
def background=(value)
@bg_color = value
end
答案 3 :(得分:1)
将attr_accessor
与alias_method
结合使用。例如:
class Foo
attr_accessor :bar
alias_method :baz, :bar
alias_method :baz=, :bar=
def initialize
end
end
然后验证它是否按预期工作:
foo = Foo.new
=> #<Foo:0x00007fabb12229a0>
foo.bar = 'foobar'
=> 'foobar'
foo.baz
=> 'foobar'
foo.baz = 'barfoo'
=> 'barfoo'
foo.bar
=> 'barfoo'