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

我最近在七周内购买了七种语言一书,并阅读了关于 Ruby的章节.在介绍块的部分(第40页)中,给出了一个代码示例,它说明了为了有条件地执行某些事情而使用块:

in_case_of_emergency do
  use_credit_card
  panic
end

def in_case_of_emergency
  yield if emergency?
end

这段代码对我来说没什么意义,本书没有提供太多解释.我想知道你们中的一位Ruby大师是否会介意帮助我解决这个问题.

你怎么能同时拥有一个块和一个同名的函数?你怎么定义“紧急情况?”我不能在没有抱怨的情况下在IRB中创建块:

NoMethodError: undefined method `in_case_of_emergency' for main:Object
    from (irb):1
    from :0

您将如何调用代码来演示它是如何工作的?谢谢!

解决方法

首先:两个订单错误.您需要先定义in_case_of_emergency.

第二:你没有命名块;因此,有两个名为in_case_of_emergency的东西是不正确的.一个函数定义,第二个是同一函数函数调用.

所以,一步一步:

def emergency?
  return rand(2) == 0
end

假设你有这个函数,它返回true的一半时间,而错误的一半时间,随机返回. (男孩,这是很多紧急情况!)然后:

def in_case_of_emergency
  yield if emergency?
end

这定义了一个名为in_case_of_emergency的函数.当被调用时,它会执行yield,如果紧急?,这是一个由条件if修改的语句产量.这是语法糖

if emergency?()
  yield
end

请注意,Ruby不需要括号来进行函数调用,因此我们可以删除它们;如果if中只有一个语句,你可以将它写在上面的同一行(不需要结束).

接下来,我们有一个函数调用

in_case_of_emergency do
  use_credit_card
  panic
end

这会调用我们刚刚定义的函数in_case_of_emergency,将一个块传递给它来执行.这些是由yield执行的两个语句(use_credit_card,panic) – 但只有在紧急情况下?评估为真.

这现在更有意义了吗?

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...