首先,我的口头禅:一个好的程序员会很好地扮演他的队友。遵循惯例就是在发挥别人的好。
你想要的似乎不合常规,正如@edgerunner 所说,这是不好的做法(阅读:我会打你的)。我要说的是,三思而后行,我不知道你的用例,它可能证明是有效的......无论如何,应该允许复活节期间有一点乐趣,所以我练习了一些元编程并使用了 Mixins。
class Foo
include MyAttrReader
my_attr_reader :var_name, :reader_name
def initialize
@var_name = 0
end
end
很干净。该模块可以解决问题(确保在上课之前加载此模块)
module MyAttrReader
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def my_attr_reader(attribute, read_attribute)
define_method "#{read_attribute}" do
instance_variable_get "@#{attribute}"
end
end
end
end
在 irb 中测试
ruby-1.9.2-p180 :001 > load 'my_attr_reader.rb'
=> true
ruby-1.9.2-p180 :002 > load 'foo.rb'
=> true
ruby-1.9.2-p180 :003 > f = Foo.new
=> #<Foo:0x00000100979658 @var_name=0>
ruby-1.9.2-p180 :004 > f.reader_name
=> 0
ruby-1.9.2-p180 :005 > f.var_name
NoMethodError: undefined method `var_name' for #<Foo:0x00000100979658 @var_name=0>
我希望你看到这对其他人来说是多么不直观。您可以重写 to_s 方法以显示如何访问@var_name,但我不会去那里......或者也定义 var_name 方法(两个 getter 方法)。遵守约定。总之,我玩得很开心,祝你好运!