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

标签 ruby function hash

我不知道如何将函数调用分配给 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/

相关文章:

ruby-on-rails - 葡萄 : required params with grape-entity

mysql - 如何在 MySQL 中以 Ruby 哈希存储多封电子邮件?

r - 如何将公式转换为函数,或将公式应用于某些值?

java - C# MD5 哈希与 Java MD5 不同

ruby - 你用 Sinatra 做什么?

javascript - Rails will_paginate 同一页面上的两个对象,从搜索字段传递一个参数

ruby - 检查 ruby​​ 散列是否包含大于 x 的值

c++ - 在具有重复项的一长串数据的滚动窗口中查找模式

sql - PL/SQL 脚本中的本地函数

c++ - 调用的对象类型 'double' 不是 report() 函数的函数或函数指针