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)和数百个呼叫周期
正如 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)