我不知道如何将函数调用分配给 ruby 哈希。 我想做的是将一个函数分配给一个哈希键,然后再 使用经典的哈希查找语法调用此函数。
def Foo()
puts "bar"
end
puts "Assigning"
test = { "foo" => Foo() }
puts "Executing"
test["foo"]
此代码失败,在哈希创建期间 puts "Assign"
之后调用函数 Foo,而在 puts "Executing"
之后没有任何反应
def Foo()
puts "bar"
end
puts "Assigning"
test = { "foo" => Foo }
puts "Executing"
test["foo"]
通过这段代码,我收到了一个未初始化的常量 Foo (NameError)
。
终于有了
def Foo()
puts "bar"
end
puts "Assigning"
test = { "foo" => :Foo }
puts "Executing"
test["foo"]
我没有输出。
有什么建议吗?
感谢大家的回答和建议。
我要做的是测试
如果基于散列的函数调用方法比
基于 if
/case
语句的等效代码。
funcs["foo"].call
比
更胖if func_name == "foo" then
Foo()
elsif ...
...
end
或
case func_name
when "foo"
Foo()
when ...
...
end
显然对于大量函数(~150)和数百个 调用周期
最佳答案
您可以使用 lambda 而不是方法。这里有两个选项:
hash = {:foo => lambda { puts 'bar } }
hash[:foo].call
第二个(更复杂)是这样的:
irb(main):001:0> class Hash
irb(main):002:1> alias :orig_anc :'[]'
irb(main):003:1>
irb(main):004:1* def [](key)
irb(main):005:2> if orig_anc(key).is_a? Proc
irb(main):006:3> orig_anc(key).call
irb(main):007:3> else
irb(main):008:3* orig_anc(key)
irb(main):009:3> end
irb(main):010:2> end
irb(main):011:1> end
=> nil
irb(main):012:0> h = {:hello => 'world', :foo => lambda { puts 'bar' }}
=> {:hello=>"world", :foo=>#<Proc:0x843224c@(irb):12 (lambda)>}
irb(main):013:0> h[:hello]
=> "world"
irb(main):014:0> h[:foo]
bar
=> nil
irb(main):015:0>
第二个只允许您跳过使用“调用”方法
关于Ruby:如何将函数映射到散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7023951/