【问题标题】:Question about 'ensure' token in Ruby关于 Ruby 中“确保”令牌的问题
【发布时间】:2010-12-07 04:12:49
【问题描述】:

我有一点关于 ruby​​ 如何解释代码中的 de ensure 子句的问题。 据我所知,确保子句必须始终由 beginend 标记括起来。

例如,如果我编写这段代码,将引发 kENSURE 错误(C:/Documents and Settings/jlomonaco/Desktop/borrar.rb:3: 语法错误,意外 d kENSURE,期待 $end)

x=5
raise "ERROR!!!" if x==5
ensure
puts "some code has been executed"

但是,如果我将此代码包装在 beginend 子句之间,则不会引发错误:

begin
x=5
raise "ERROR!!!" if x==5
ensure
puts "some code has been executed"
end

所以我的问题来了:

我发现在函数内定义不是必须在开始和结束之间包装确保标记;例如,我可以只写这段代码,不会引发任何错误:

def stackoverflow
 x=5
 raise "ERROR!!!" if x==5
ensure
 puts "some code has been executed"
end

stackoverflow

如果我编写开始和结束标记,代码也可以正常工作。 那么,BEGIN 和 END 子句必须放在哪里?

谢谢!

【问题讨论】:

    标签: ruby


    【解决方案1】:

    此行为记录在The Ruby Programming Language

    在整个讨论中 异常处理,我们已经描述 救援,否则,并确保关键字 作为开始语句的子句。在 事实上,它们也可以用作从句 def 语句的(定义一个 方法),类语句(定义 一个类)和模块语句 (定义一个模块)。方法定义 包含在第 6 章中;班级和 模块定义包含在 第 7 章。

    我发现这是一本很棒的参考书。

    【讨论】:

      【解决方案2】:

      基于一些实验,确保在 begin、def、class 和 module 块(即定义 + begin)中似乎是有效的,但不是在顶层,也不是在循环、条件或 do 块 / { |参数| ... }。

      【讨论】:

      • 是的,我认为我的问题非常微妙,答案是你所说的实验!感谢您提供这些信息!
      • 好的答案需要事实而不是推测。
      • 实验结果就是事实。但我明白你的意思;参考文档(就像 Mark Westling 所做的那样)通常比使用解释器更好,所以我会投票赞成 Mark 的答案。
      • 当然,我更喜欢书籍参考而不是基于实验的答案;但由于这个问题太具体了,我怀疑它是否有“书”的答案。无论如何,您的实验和结论是正确的 wdebeam,再次非常感谢 :)
      猜你喜欢
      • 1970-01-01
      • 2020-09-06
      • 2020-01-22
      • 2018-04-26
      • 2022-01-13
      • 2012-02-07
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多