Если вы действительно просто хотите довольно такого рода вещи вверх, почему бы не обернуть все методы в классе так:
# 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"
Еще одна основная ошибка, которую вы сделали, заключается в том, что вы инициализировали @a
вне любого метода экземпляра - , только что обрезанный внутри определения A
. Это большое время нет-нет, потому что это просто не работает. Помните, что в ruby все является объектом, включая классы, а префикс @
означает экземпляр переменной любого объекта в настоящее время. Внутри определения метода экземпляра self
является экземпляром класса . Но вне этого, только внутри определения класса, self
- это объект класса, поэтому вы указали переменную экземпляра с именем @a
для объекта класса A
, который ни один из экземпляров A
не может получить напрямую.
У Ruby есть причина для этого поведения (переменные экземпляра класса могут быть очень удобными, если вы знаете, что вы делаете ), но это более совершенная техника.
Короче говоря, только инициализировать переменные экземпляра в методе initialize
.
Это действительно то, что я пытался избежать. Код, который я бы поставил в лямбда, может немного запутаться, и у меня будет около 15 элементов хэша. Это немного забивает код. – Peter
@Peter: Является ли код messier в лямбда, чем в методе? – Chuck
, затем передайте имена методов в виде символов и используйте send или Symbol # to_proc. –