Прежде всего, моя мантра: Хороший программист хорошо играет своих товарищей по команде.Следование соглашениям - это хорошая игра для других.
То, что вы хотите, кажется нетрадиционным, и, как утверждает @edgerunner, это плохая практика (читай: я бы вас ударил).Все, что я говорю, подумай дважды об этом, я не знаю твоего сценария использования, он может оказаться верным ... В любом случае, на Пасху должно быть позволено немного повеселиться, поэтому я попрактиковался в метапрограммировании и поиграл с Миксинами.
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).Придерживайтесь соглашений.Во всяком случае, мне было очень весело, удачи!