ruby中的类后代语法

时间:2015-09-20 20:40:06

标签: ruby-on-rails ruby

我在代码学校做'红宝石位'课程,并开始讨厌它。作业需要知识,这些知识在他们的短期讲座中没有涉及,这迫使我去谷歌。有时我甚至不知道所需的搜索词。任何人都可以帮我理解下面代码中发生的事情吗?

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

我不太清楚第一行发生了什么。还有为什么需要使用begin语句?第四行不够吗?

2 个答案:

答案 0 :(得分:3)

第一行相当于

class InvalidGameError < StandardError
end

这是定义新异常的常用Ruby方法。在这种情况下,您可以定义从InvalidGameError继承的StandardError异常。

begin/rescue/end阻止是Ruby exception handling mechanism

如果在InvalidGameError之间执行代码期间会引发任何begin/rescue,Ruby将执行rescue之后的任何代码。

begin
  # do something
rescue StandardError
  # do something if the error occurs
end

答案 1 :(得分:2)

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

我知道,它令人困惑,但是这段代码使用了一些你真正需要知道的概念,然后才能理解它,即:异常处理,哈希和条件以及Ruby对象真值