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