将函数存储在散列中键的值中

Lew*_*uce 2 ruby

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

case step
when 1
   # step_two_function
when 2
   # step_three_function
when 3
   # step_four_function
end
Run Code Online (Sandbox Code Playgroud)

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

例如,

h = {
   1 => step_two_function,
   2 => step_three_function,
   3 => step_four_function,
}
Run Code Online (Sandbox Code Playgroud)

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

这样做是否可行,如果可以,如何做?

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

>>> def lies(altons_var):
...     print(altons_var)
... 
>>> a[1] = lies
>>> a[1]('print me please')
print me please
Run Code Online (Sandbox Code Playgroud)

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

Tod*_*obs 5

使用 Proc 或 Lambda 作为哈希值

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

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

step.keys.map { |i| step[i].call }
#=> ["foo", "bar", "baz"]
Run Code Online (Sandbox Code Playgroud)

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