Метод класса как хэш-значение
У меня есть этот рабочий код:
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() вызывает создание my_hash, но если я попытаюсь изменить код на:
my_hash = { :on_filter => { action } }
Я получаю сообщение об ошибке.
Можно ли создать хеш с помощью методов как хэш-значений?
Ответы
Ответ 1
Если вам нужен метод, в Ruby вам нужно позвонить... method
: -)
my_hash = { :on_filter => { method(:action) } }
Обратите внимание, что ваш исходный код мог быть написан:
@server.handle(&method(:action))
Это говорит ему использовать метод action
в качестве параметра блока (поэтому существует &
). Вместо этого вы проходили блок, поэтому, чтобы быть полностью эквивалентным, теперь вы можете передать блок вместо метода, если хотите:
my_hash = { :on_filter => Proc.new{ action } }
Ответ 2
Уверен, что это возможно, но не точно с помощью методов (поскольку методы не являются объектами в Ruby), но вместо них Proc
. Посмотрите этот учебник, например.
Короче говоря, вы сможете достичь того, чего хотите,
my_hash = { :on_filter => Proc.new{action} }
в Client#initialize
.