まず、私のモットーは次のとおりです。優れたプログラマーは、チームメイトを上手に演じます。慣習に従うことは、他の人をうまく演じています。
あなたが望むものは型にはまらないようで、@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 メソッドも定義します (2 つの getter メソッド)。規則に固執します。とにかく、とても楽しかったです、頑張ってください!