我在代码学校做'红宝石位'课程,并开始讨厌它。作业需要知识,这些知识在他们的短期讲座中没有涉及,这迫使我去谷歌。有时我甚至不知道所需的搜索词。任何人都可以帮我理解下面代码中发生的事情吗?
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语句?第四行不够吗?
答案 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对象真值