微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

你如何使用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) – 但只有在紧急情况下?评估为真.

这现在更有意义了吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐