Ste*_*son 5 ruby yield function block
我最近在七周内购买了七种语言一书,并阅读了关于Ruby的章节.在介绍块的部分(第40页)中,给出了一个代码示例,它说明了为了有条件地执行某些事情而使用块:
in_case_of_emergency do
use_credit_card
panic
end
def in_case_of_emergency
yield if emergency?
end
Run Code Online (Sandbox Code Playgroud)
这段代码对我来说没什么意义,本书没有提供太多解释.我想知道你们中的一位Ruby大师是否会介意帮助我解决这个问题.
你怎么能同时拥有一个块和一个同名的函数?你怎么定义"紧急情况?" 我不能在没有抱怨的情况下在IRB中创建块:
NoMethodError: undefined method `in_case_of_emergency' for main:Object
from (irb):1
from :0
Run Code Online (Sandbox Code Playgroud)
您将如何调用此代码来演示它是如何工作的?谢谢!
Ama*_*dan 10
首先:两个订单错误.你需要先定义in_case_of_emergency.
第二:你没有命名块; 因此,有两个名称是不正确的in_case_of_emergency.一个是函数定义,第二个是同一函数的函数调用.
所以,一步一步:
def emergency?
return rand(2) == 0
end
Run Code Online (Sandbox Code Playgroud)
假设你有这个函数可以随机返回true一半的时间和false一半的时间.(男孩,这是很多紧急情况!)然后:
def in_case_of_emergency
yield if emergency?
end
Run Code Online (Sandbox Code Playgroud)
这定义了一个名为的函数in_case_of_emergency.调用时,它会执行yield if emergency?,这是yield由条件修改的语句if.这是语法糖
if emergency?()
yield
end
Run Code Online (Sandbox Code Playgroud)
请注意,Ruby不需要括号来进行函数调用,因此我们可以删除它们; 如果在一个内部只有一个语句if,你可以在上面的同一行写它(不需要一个end).
接下来,我们有一个函数调用:
in_case_of_emergency do
use_credit_card
panic
end
Run Code Online (Sandbox Code Playgroud)
这会调用我们刚刚定义的函数in_case_of_emergency,并传递一个块来执行.这些是将由- 执行的两个语句(use_credit_card,panic)yield- 但仅在emergency?求值时才执行true.
这现在更有意义了吗?