あなたは本当にただの事を上のかなりこの種、 はなぜこれほどのようなクラスで、すべてのメソッドをラップしないようにしたい場合:
# a container to store all your methods you want to use a hash to access
class MethodHash
alias [] send
def one
puts "I'm one"
end
def two
puts "I'm two"
end
end
x = MethodHash.new
x[:one] # prints "I'm one"
x.two # prints "I'm one"
や、あなたの例を使用する:
# a general purpose object that transforms a hash into calls on methods of some given object
class DelegateHash
def initialize(target, method_hash)
@target = target
@method_hash = method_hash.dup
end
def [](k)
@target.send(@method_hash[k])
end
end
class A
def initialize
@a = DelegateHash.new(self, { 0 => :a })
end
def a()
puts "hello world"
end
def b()
@a[0]
end
end
x = A.new
x.a #=> prints "hello world"
x.b #=> prints "hello world"
あなたが作成したもう1つの基本的なエラーは、A
の定義内にちょうど裸の のインスタンスメソッドの外に@a
を初期化したことです。これはちょうどうまくいかず、それはうまくいきません。 ルビではすべてがクラスを含むオブジェクトであり、@
という接頭辞はインスタンス のインスタンスであり、現在のオブジェクトはすべて自己のものであることを意味します。インスタンスメソッドの定義の中で、self
はクラスのインスタンス です。しかし、それ以外では、クラス定義内ではself
がクラスオブジェクトです。したがって、A
のインスタンスのどれも直接取得できないクラスオブジェクトのインスタンス変数@a
をクラスオブジェクトA
に定義しました。
Rubyにはこの動作の理由があります(クラスインスタンス変数はあなたが何をしているのか知っていれば本当に便利です)。これはもっと高度な技術です。
要するに、initialize
メソッドでインスタンス変数を初期化するだけです。
でそれを呼び出す必要がありますI避けようとしていた。私がラムダに入れるコードはちょっと混乱するかもしれません。そして、私はハッシュに約15要素を持っています。それはコードをちょっと混乱させます。 – Peter
@Peter:コードはメソッド内にあるよりもラムダで扱いにくいですか? – Chuck
次に、メソッド名をシンボルとして渡し、sendまたはSymbol#to_procを使用します。 –