首页 > 解决方案 > 将函数存储在哈希中键的值中

问题描述

现在,我的 ruby​​ 代码如下所示:

case step
when 1
   # step_two_function
when 2
   # step_three_function
when 3
   # step_four_function
end

但是,我想知道是否可以将其存储在哈希中以使事情更简单一些?

例如,

h = {
   1 => step_two_function,
   2 => step_three_function,
   3 => step_four_function,
}

并且能够简单地使用类似h[step]. 看起来,在 Ruby 中,函数在创建哈希的同时执行,而不是仅在调用键的值时执行。

这样做有可能吗?如果可以,怎么做?

在 python 中,您只需执行以下操作:

>>> def lies(altons_var):
...     print(altons_var)
... 
>>> a[1] = lies
>>> a[1]('print me please')
print me please

但这在 Ruby 中不起作用,因为在您调用函数的那一刻(无论是直接调用还是从散列调用),它都会执行该函数。

标签: ruby

解决方案


使用 Proc 或 Lambda 作为哈希值

您所追求的功能可能最好由Proclambda表示。这些对象是可以在以后传递和执行的闭包。作为一个有些人为的例子,请考虑以下代码:

step = {
  1 => ->{p "foo"},
  2 => ->{p "bar"},
  3 => ->{p "baz"},
}

step.keys.map { |i| step[i].call }
#=> ["foo", "bar", "baz"]

散列中的每个值都包含一个“存根 lambda”,您可以使用Proc#call方法调用它。usingstep.keys.map简单地遍历散列中的所有键并依次调用每个键,但您也可以从散列中调用单个 lambdastep[1]或类似。


推荐阅读