gpt4 book ai didi

ruby - 将一个函数传递给另一个函数并调用它

转载 作者:太空宇宙 更新时间:2023-11-03 17:00:14 25 4
gpt4 key购买 nike

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 或调用(我只熟悉来自其他语言的调用的概念)

最佳答案

您可以通过两种不同的方式做到这一点:

  1. 传递方法的名称(通常作为符号,但字符串也可以):

    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")

  2. 使用 block :

    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(它更快),但有时需要能够按名称引用 block (例如,如果您需要将它传递给另一个方法,或调用它来自另一个 block ),在这种情况下,必须将其作为命名参数(即 def meth(arg1, arg2, &block_name))。

    block、Proc 和 lambda 之间的区别对 Ruby 新手来说是个挑战,关于它们的文章很多——只需谷歌一下“Ruby block proc lambda”。这是一篇非常好的文章,可以帮助您入门:http://awaxman11.github.io/blog/2013/08/05/what-is-the-difference-between-a-block/

关于ruby - 将一个函数传递给另一个函数并调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26431097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com