метод класса как хеш-значение - PullRequest
2 голосов
/ 08 апреля 2010

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

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 ]

1 голос
/ 08 апреля 2010

Когда вы хотите метод, в Ruby вы должны вызвать ... method: -)

my_hash = { :on_filter => { method(:action) } }

Обратите внимание, что ваш оригинальный код мог быть написан:

@server.handle(&method(:action))

Это говорит о том, что он должен использовать метод action в качестве параметра блока (именно поэтому существует &). Вместо этого вы передавали блок, поэтому, чтобы быть полностью эквивалентным, теперь вы можете передать блок вместо метода, если предпочитаете:

my_hash = { :on_filter => Proc.new{ action } }
0 голосов
/ 08 апреля 2010

Конечно, это возможно, но не точно с методами (поскольку методы не являются объектами в Ruby), но вместо этого с Proc объектами.Взгляните, например, на этот учебник .

Короче говоря, вы сможете достичь желаемого с помощью

my_hash = { :on_filter => Proc.new{action} }

в вашем Client#initialize.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...