Метод класса как хэш-значение

У меня есть этот рабочий код:

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.