2014-12-25 2 views
1

Я знаю, что в Ruby, вы можете создать хэш-карты, как это:магазин функции в хэш

hash = {"name"=>"John"} 

Но можно иметь хэш-карту методов:

hash = {"v"=> show_version} 

и при вызове hash["v"] либо для выполнения функции show_version, либо для возврата некоторого вида на указатель, который передан на какой-то специальный метод, для выполнения функции из хэша?

То, что я пытаюсь достичь, состоит в том, чтобы иметь хеш-карту методов, вместо того, чтобы использовать конструкцию case/when, поскольку она выглядит слишком многословной для меня.

+1

'hash = {: v => lambda {puts 'called'; }} 'и/или' hash = {: v => self.class.instance_method (: method_name)} '. – mudasobwa

+0

@mudasobwa, спасибо большое !!! –

ответ

4

Не совсем так, нет. Вам нужно ухватить объекта Method прокси для метода и хранения, что в Hash:

hash = { 'v' => method(:show_version) } 

И вам нужно call на Method объект:

hash['v'].() 

Method утиного типов Proc, так что вы могли бы даже хранить простые Proc s вместе с Method s в Hash и не было необходимости их различать, потому что оба они называются одинаково:

hash['h'] = -> { puts 'Hello' } 
hash['h'].() 
# Hello 
+0

Кроме того, вы можете передать аргумент следующего пути 'hash ['h'] = -> (param) {puts" hello # {param} "}' 'hash ['hello']. ('World') ' ' #hello world' – betomoretti

Смежные вопросы