加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 03:30:04 所属栏目:百科 来源:网络整理
导读:我无法弄清楚如何将函数调用分配给 ruby哈希. 我想要做的是将一个函数分配给一个哈希键,以后再 使用经典散列监视语法调用此函数. def Foo() puts "bar"endputs "Assigning"test = { "foo" = Foo() }puts "Executing"test["foo"] 此代码失败,函数Foo在放置“
我无法弄清楚如何将函数调用分配给 ruby哈希.
我想要做的是将一个函数分配给一个哈希键,以后再
使用经典散列监视语法调用此函数.

def Foo()
  puts "bar"
end

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

puts "Executing"
test["foo"]

此代码失败,函数Foo在放置“分配”后调用,在散列创建期间,并且在放置“执行”后没有任何反应

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中[ “富”].通话

胖子比

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>

第二个只允许您跳过使用’call’方法

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读