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

Ruby 将函数存储在散列中键的值中,ruby,Ruby,现在,我的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

现在,我的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中不起作用,因为在您调用函数的那一刻(无论是直接调用还是通过哈希调用),它就会执行函数。

您可以使用send关键字

send h[step]
由于您直接在散列的值部分写入方法名,因此正在进行调用,但是如果您将方法名存储为字符串,然后按如下所示的send方法调用,则可以进行调用

def hi
  puts 'hi'
end

def hello
  puts 'hello'
end

h = {
    1 => 'hi',
    2 => 'hello',
}

send h[1]
您可以在这里使用方法()。对于散列键,可以使用任何[symbol,string]

例:

您还可以使用Proc实现它,Lambda也可以使用Proc或Lambda作为散列值 您所追求的功能可能最好用or来表示。这些对象是可以传递并在以后执行的闭包。作为一个有缺陷的例子,请考虑下面的代码:

步骤={
1=>->{p“foo”},
2=>->{p“bar},
3=>->{p“baz”},
}
step.keys.map{| i | step[i].call}
#=>[“foo”、“bar”、“baz”]
散列中的每个值都包含一个“存根lambda”,您可以使用该方法调用它。使用
step.keys.map
只需迭代散列中的所有键并依次调用每个键,但也可以使用
step[1]
或类似方法从散列中调用单个lambda

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

Ruby没有函数。你所拥有的是方法,而不是函数

有多种可能性。你可以把它储存在冰箱里。要获得
方法
对象,可以使用以下方法:

h={
1=>方法(:步骤二函数),
2=>方法(:步进三步函数),
3=>方法(:步进四步函数),
}
Method
s有一个方法,因此可以这样调用它们:

case step
when 1
   # step_two_function
when 2
   # step_three_function
when 3
   # step_four_function
end
h[2]。调用
或者,通过使用
调用
语法:

h[2]。()
第二种可能性是使用s而不是
方法
s:

h={
1 => -> {
#“第二步”功能的内容`
},
2 => -> {
#“第三步”功能的内容`
},
3 => -> {
#“步骤四”功能的内容`
},
}
或者,如果不可能,可以从
Proc
s调用方法:

h={
1=>->{step_two_function},
2=>->{step_three_function},
3=>->{step_four_function},
}
Proc
s还有一个方法,因此您可以用调用
method
s的方法调用它们

最后一个选项是将方法的名称存储在
散列中:

h={
1=>:第二步函数,
2=>:第三步函数,
3=>:步进四步函数,
}
然后您可以使用:

public\u发送(h[2])

请不要使用,除非您绝对必须使用,即如果您绝对需要绕过访问限制。

我会将函数存储为Proc对象:

 h = {
     1 => :step_to_function.to_proc, 
     2 =>  proc { ... } 
     # etc.
 }
然后调用它作为

h[1].call
h[2].call

依我看,这是最具可读性的方式,因为我们可以清楚地看到在定义端和调用端发生了什么。它还可以方便地在此处定义一个函数,而不给它命名,正如我在
h[2]

中所展示的那样,我认为问题在于,一旦我完成散列的定义,h就会尝试调用其中定义的所有函数。@LewlSauce这是因为您直接编写函数名,而这将调用该方法,你必须把它当作一根绳子。请参见上面的示例。@Rajagpalan我有各种函数,只有在将某个数字传递给主函数时才能调用这些函数。似乎编辑过的示例只是简单地将字符串存储为键的值,而不是仅当您
send h[1]
时才实际调用
hi
hello
函数,除非我误解了是,它仅在执行过程中遇到
send h[1]
时才会调用。这就是你想要的,对吗?您可以在
send h[2]
send h[2]
中传递任何数字,我相信这个示例根本不调用该函数。我看不到
h
散列与之前定义的任何函数之间有任何引用。无论上面的两个函数是否存在,本例中的send h[1]命令都将起作用。。我基本上是尝试将对函数的调用存储为变量,这样我就可以简单地调用键,然后调用关联的函数。
step\u two\u function
是方法名,因此它将在声明散列时调用函数,必须将其作为字符串,然后必须调用,就像我在下面所示的那样。