Ruby on rails ruby中的类子体语法

Ruby on rails ruby中的类子体语法,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在上代码学校的“ruby bits”课程,开始有点讨厌它了。作业需要的知识在他们的简短讲座中没有涉及,这迫使我去谷歌。有时我甚至不知道需要什么搜索词。谁能帮我理解下面的代码中发生了什么 class InvalidGameError < StandardError; end def new_game(name, options={}) raise InvalidGameError, "You must provide a name for this game." unless na

我正在上代码学校的“ruby bits”课程,开始有点讨厌它了。作业需要的知识在他们的简短讲座中没有涉及,这迫使我去谷歌。有时我甚至不知道需要什么搜索词。谁能帮我理解下面的代码中发生了什么

class InvalidGameError < StandardError; end

def new_game(name, options={})
  raise InvalidGameError, "You must provide a name for this game." unless name
  {
    name: name,
    year: options[:year],
    system: options[:system]
  }
end

begin
  game = new_game(nil)
rescue InvalidGameError => e
  puts "There was a problem creating your new game: #{e.message}"
end
类InvalidGameErrore
放置“创建新游戏时出现问题:#{e.message}”
结束

我不太明白第一行发生了什么。为什么需要begin语句?第四行不够吗?

第一行相当于

class InvalidGameError < StandardError
end

第一行是定义一个新的异常,即面向对象编程语言如何处理运行时错误。在这种情况下,讲师定义新异常的唯一原因是,当您阅读代码时,您确切地知道正在处理的错误。您可以直接使用StandardError,但对于代码正在处理的错误,InvalidGameError是一个更好的名称。 让我们以您发布的代码为例: new_game的方法要求用户提供一个名称,如果您试图使用设置为nil或false的名称来调用它(new_game(nil,{年份:2015,系统:“xbox”}))您的代码将引发一个异常,该异常将停止并退出程序,否则该方法将返回一个包含三对的散列:一个名称键,其值设置为作为参数提供的名称;一个年份键,其值设置为选项散列的年份键;以及一个系统键,其值设置为选项散列的系统键


我知道,这很让人困惑,但这段代码使用了一些您在理解它之前确实需要知道的概念,即:异常处理、哈希、条件和Ruby对象真值在irb?中,当引发异常时,代码将停止在
raise INVALIDGAMERROR
,并从
rescue
语句继续执行。你应该阅读我发布的关于异常处理的链接。否。当引发异常时,代码已经在begin中(因为从begin块中调用了
new_game
)。是的,谢谢。我已经学习了哈希和条件语句。异常的概念让我感到困惑。请将其视为处理代码已经运行时可能发生的错误的一种方法,您无法预测这些错误何时会发生,但您知道它们可能会发生。例如,如果您正在读取一个文件,突然有人在您完成读取之前删除了该文件。你可以预测这可能发生,但你无法预测何时发生
begin
  # do something
rescue StandardError
  # do something if the error occurs
end