Ruby:如何将函数映射到散列

ric*_*ico 5 ruby hash function

我无法弄清楚如何将函数调用分配给ruby哈希.我想要做的是为散列键分配一个函数,然后使用经典的散列监视语法调用此函数.

def Foo()
  puts "bar"
end

puts "Assigning"
test = { "foo" => Foo() }

puts "Executing"
test["foo"]
Run Code Online (Sandbox Code Playgroud)

此代码失败,puts "Assign"在哈希创建期间调用函数Foo,之后没有任何反应puts "Executing"

def Foo()
  puts "bar"
end

puts "Assigning"
test = { "foo" => Foo }

puts "Executing"
test["foo"]
Run Code Online (Sandbox Code Playgroud)

用这个代码我收到了uninitialized constant Foo (NameError).

最后用

def Foo()
  puts "bar"
end

puts "Assigning"
test = { "foo" => :Foo }

puts "Executing"
test["foo"]
Run Code Online (Sandbox Code Playgroud)

我没有输出.

有什么建议?

感谢大家的回答和建议.

我要做的是测试基于散列的调用函数方法是否比基于if/ casestatements 的等效代码更快.

funcs["foo"].call

胖子比

if func_name == "foo" then
  Foo()
elsif ...
...
end
Run Code Online (Sandbox Code Playgroud)

要么

case func_name
when "foo"
  Foo()
when ...
  ...
end
Run Code Online (Sandbox Code Playgroud)

很明显,对于大量的功能(~150)和数百个呼叫周期

emb*_*oss 3

正如 Vlad 指出的那样,仅仅通过使用覆盖方法Hash检索哈希键来使您的函数执行并不容易,即[]

def foo
  puts "hi"
end

... # magic

test["foo"] # outputs hi
Run Code Online (Sandbox Code Playgroud)

行不通的。不过,您可以做的是使用Object#method分配方法引用,然后使用以下方法调用它call

def foo
  puts "hi"
end

test = { "foo" => method(:foo) }

test["foo"].call # => hi
Run Code Online (Sandbox Code Playgroud)