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

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

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,

Другие вопросы по тегам