如何在 Ruby 中将子程序存储到变量中?

jol*_*yne 1 ruby subroutine

我试图证明您可以将子例程存储在变量中(除非您不能)。我的这段代码有可能全错吗?

我有来自 Python 的代码,它可以完成我想做的事情

def printSample(str)   
   puts str 
end  
x = printSample 
str = "Hello" 
x(str) 
Run Code Online (Sandbox Code Playgroud)

预期输出:

你好

我是 Ruby 的初学者,只是想学习基本代码。

Ste*_*fan 5

您的 Python 代码可以转换为 Ruby,如下所示:

def print_sample(str)
  puts str
end

x = method(:print_sample)
str = "Hello"
x.(str)
Run Code Online (Sandbox Code Playgroud)

主要区别在于,由于 Ruby 中的括号是可选的,因此编写时x = print_sample已经调用了该方法。检索稍后可以调用的Method对象有点复杂:您必须调用method方法名称并将其作为符号或字符串传递。(接收者是定义该方法的对象)

而且由于方法对象是常规对象,因此实际调用方法的语法也略有不同。红宝石提供:

x[str]
x.(str)
x.call(str)
Run Code Online (Sandbox Code Playgroud)

作为x.(str)的语法糖x.call(str),请参阅Method#call


send另一种方法是仅存储方法名称并通过/动态调用该方法public_send,例如:

x = :print_sample
str = "Hello"
send(x, str)
Run Code Online (Sandbox Code Playgroud)

在 Ruby 中,通过(符号化)名称引用方法是非常惯用的。