【问题标题】:Ruby Syntax of '=>''=>' 的 Ruby 语法
【发布时间】:2018-06-08 01:00:35
【问题描述】:

在带有哈希的 ruby​​ 中使用 => 似乎很简单:

a = {key1: => value1, key2: => value2}
b = {"key1" => value1, "key2" => value2}

Ruby 大量使用了语法糖。这是一个示例代码块

begin
   [some code]
rescue Exception => e
   [some error handling code]
end

救援行中到底发生了什么,特别是在Exception 和变量e 之间以及=> 之间? rescue 是保留关键字,e 显然是变量。其余的部分?这种情况下=>的作用是什么?

更新 每个人似乎都没有抓住重点。我知道“救援异常=> e”与哈希无关。我想从语法上知道那行发生了什么。

“rescue”一词是关键字保留字,是 ruby​​ 语言的一部分。我很确定“e”是一个变量,在功能上也可以是“a”、“b”或“c”。什么是“异常”和“=>”?有没有另一种方法来编写这个表达式,让像我这样的人更容易理解它,这些人对语法严格且没有语法糖的语言进行了编程?

【问题讨论】:

  • { key1: "cat" }{ :key1 => "cat" } 的简写,但{ key1: => "cat" } 的语法不正确。有时你会看到{ "key1": "cat" }。与{ key1: "cat" }相同,但包含空格的符号必须加引号,所以{:"key 1" => "cat}的简写形式为{ "key 1": "cat" }(需要加引号)。
  • 所以我认为每个人都错过了我的问题的要点。我不太关心救援的细微差别,只把代码放在那里,因为它有一个我希望完全理解的句法结构的例子。有关更多详细信息,请参阅上面的更新。
  • 我之前的评论是正确的,但不完整,因为必须引用的符号绝不限于包含空格的符号。见this SO question

标签: ruby syntax


【解决方案1】:

默认情况下,rescue 只救援RuntimeError,这也是raise 的默认类,没有明确的异常类声明:

begin
  raise "foo"
rescue
  puts "rescued"
end

如果需要访问异常实例,可以使用以下语法:

begin
  raise "foo"
rescue => e
  puts "rescued #{e.message}"
end

也可以在不同的子句中挽救不同的例外情况:

class Error1 < RuntimeError; end
class Error2 < RuntimeError; end

begin
  [some code]
rescue Error1 => e
  puts "rescued an instance of Error1: #{e.message}"
rescue Error2 => e
  puts "rescued an instance of Error2: #{e.message}"
rescue => e # standard RuntimeError
  puts "rescued a generic error: #{e.message}"
end

也就是说,这种语法与哈希无关,它用于区分许多 rescue 块中的不同异常类。

在您的示例中,有一个 Exception(它不是 RuntimeError 的继承者,默认情况下不获救)获救。虽然这被认为是一种不好的做法(因为此处的边距太小而无法描述),但有时它仍然有用。

【讨论】:

猜你喜欢
  • 2016-02-12
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
相关资源
最近更新 更多