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

How to store a subroutine to a variable in Ruby?

我试图证明您可以将子例程存储在变量中(除非您不能)。有没有可能我只是把这段代码都弄错了?

I have this code from Python that does what I want to do

def printSample(str)   
   puts str 
end  
x = printSample 
str = "Hello" 
x(str) 

预期输出:

Hello

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

处理实例方法的示例:

class Demo
  def initialize(s); @s = s; end
  def printSample(str); puts(@s+str); end
end

x = Demo.instance_method(:printSample)
# x is now of class UnboundMethod

aDemo = Demo.new("Hi")

# Use x
x.bind(aDemo).call("You")  # Outputs: HiYou

在这个例子中,我们首先存储方法,然后将它应用到一个实例中。如果先有实例,以后想取方法,就更简单了。假设上面 Demo 的 class 定义,你同样可以做 a

aDemo = Demo.new("Hi")
y = aDemo.method(:printSample)
y.call("You")

您的 Python 代码可以翻译成 Ruby 为:

def print_sample(str)
  puts str
end

x = method(:print_sample)
str = "Hello"
x.(str)

主要区别在于,因为 Ruby 中的括号是可选的,所以编写 x = print_sample 已经调用了该方法。检索 Method object that you can call later is a little more involved: you have to call method 并将方法名称作为符号或字符串传递。 (接收者是定义方法的对象)

并且由于方法对象是常规对象,实际调用方法的语法也略有不同。 Ruby 提供:

x[str]
x.(str)
x.call(str)

x.(str)x.call(str) 的语法糖,参见 Method#call


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

x = :print_sample
str = "Hello"
send(x, str)

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