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 中是非常惯用的。
我试图证明您可以将子例程存储在变量中(除非您不能)。有没有可能我只是把这段代码都弄错了?
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 中是非常惯用的。