gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:14:42 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com