你如何使用Ruby块来有条件地执行某些操作?

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.

这现在更有意义了吗?