Ruby中的函数不是一流的对象,但是我希望能够将对一个函数的引用传递到另一个函数中并执行它。如何才能做到这一点?
例子:
def run_a_function_twice(my_function)
# Call the function once.
# Call the function again.
end
def say_hello
puts "HI!"
end
run_a_function_twice(say_hello)
我正在阅读文档,但不确定是否应该尝试使用lambda,proc或call(我只熟悉其他语言的call概念)
您可以通过两种不同的方式执行此操作:
传递方法的名称(通常作为符号,但也可以使用字符串):
def run_a_method_twice(method_name)
send(method_name)
send(method_name)
end
run_a_method_twice(:say_hello)
这取决于say_hello
是否在与相同的范围内可用run_a_method_twice
,例如,如果它们都是同一类上的两个实例方法。如果say_hello
是在另一个对象上定义的,则应执行例如some_obj.send(:say_hello)
。
您可以通过send
在方法名称(例如)之后给它们提供参数来为方法提供参数jordan.send(:say_hello, "Donny")
。
使用块:
def yield_to_a_block_twice
yield
yield
end
yield_to_a_block_twice { say_hello }
此语法也适用:
def call_a_block_twice(&block)
block.call
block.call
end
您应该yield
在可能的情况下使用它(更快),但是有时必须能够按名称引用该块(例如,如果您需要将其传递给另一个方法,或者从另一个块中调用它),在这种情况下,是否需要命名参数(即def meth(arg1, arg2, &block_name)
)。
对于Ruby新手来说,block,Proc和lambda之间的区别是具有挑战性的,并且已经有很多关于它们的文章-只是谷歌“ Ruby block proc lambda”。这是一篇不错的入门文章:http : //awaxman11.github.io/blog/2013/08/05/what-is-the-difference-between-a-block/
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句