Метод класса как хеш-значение
У меня есть этот рабочий код:
class Server
def handle(&block)
@block = block
end
def do
@block.call
end
end
class Client
def initialize
@server = Server.new
@server.handle { action }
end
def action
puts "some"
end
def call_server
@server.do
end
end
client = Client.new
client.call_server
Мой сервер будет обрабатывать более одного действия, поэтому я хочу изменить код следующим образом:
class Server
def handle(options)
@block = options[:on_filter]
end
def do
@block.call
end
end
class Client
def initialize
@server = Server.new
my_hash = { :on_filter => action }
@server.handle(my_hash)
end
def action
puts "some"
end
def call_server
@server.do
end
end
client = Client.new
client.call_server
Это неверный код, потому что метод action() вызывает метод create my_hash, но если я попытаюсь изменить код на:
my_hash = { :on_filter => { action } }
я получаю сообщение об ошибке.
Можно ли создать хэш с методами в качестве хэш-значений?
2 ответа
Когда вы хотите метод, в Ruby, вы должны вызвать... method
:-)
my_hash = { :on_filter => { method(:action) } }
Обратите внимание, что ваш оригинальный код мог быть написан:
@server.handle(&method(:action))
Это говорит о том, чтобы использовать метод action
в качестве параметра блока (именно поэтому существует &
). Вместо этого вы передавали блок, поэтому, чтобы быть полностью эквивалентным, теперь вы можете передать блок вместо метода, если предпочитаете:
my_hash = { :on_filter => Proc.new{ action } }
Конечно, это возможно, но не точно с методами (поскольку методы не являются объектами в Ruby), но с Proc
объекты вместо Взгляните на этот учебник, например.
Короче говоря, вы должны быть в состоянии достичь того, что вы хотите,
my_hash = { :on_filter => Proc.new{action} }
в вашем Client#initialize
,