Ruby函数作为哈希值

11
我想知道是否有可能将函数映射到哈希表的值上,如果可以,如何实现。
例如: ----开始类------------
def foo(var)
    return var + 2
end

hash_var = { func => foo() }

----类结束--------------

以便稍后调用

Class::hash_var["func"][10]
或者
Class::hash_var["func"](10)

这会返回12吗?

5个回答

10
您可以使用 method 方法。
def foo(var)
      return var + 2
end

hash_var = { :func => method(:foo) }

hash_var[:func].call(10)

4

函数/方法是Ruby中不是对象的少数事物之一,因此您不能将它们用作哈希中的键或值。与函数最接近的东西是proc对象。因此,最好使用这些...

其他答案基本上列出了如何将proc放入哈希表中作为值的所有可能方式,但我仍将总结一下;)

hash = {}

hash['variant1'] = Proc.new {|var| var + 2}
hash['variant2'] = proc     {|var| var + 2}
hash['variant3'] = lambda   {|var| var + 2}

def func(var)
  var + 2
end

hash['variant4'] = method(:func) # the *method* method returns a proc
                                 # describing the method's body 

评估procs的方法也有不同:

hash['variant1'].call(2) # => 4
hash['variant1'][2]      # => 4
hash['variant1'].(2)     # => 4

3
您可以将值设置为Proc并调用它。
hash_var = {
  'func' =>  proc {|x| x+2}
}

hash_var['func'].call(10) #=> 12

2
尝试使用Lambda表达式。
hash_var = { :func => lambda { |var| var + 2 }}
hash_var['func'].call(5) #=> 7

Lambda方法与Proc方法具有相同的效果;它们都会生成包含提供的块的Proc对象。 - John Douthat
是的,我知道!!在我回答之前,我没有看到处理程序的答案!! - Raghu

0

另一个选项是:

def foo(name)
    puts "Hi #{name}"
end

def bar(numb)
    puts numb + 1
end

hash_var = { func: :foo, func2: :bar }
send hash_var[:func], "Grid"
# => Hi Grid
send hash_bar[:func2], 3
# => 4

这里是关于 #send 方法的一些信息 Ruby 中 send() 是做什么用的?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接