美文网首页Rails 成功之路RubyRuby on Rails
Ruby学习笔记4(范围,迭代器,异常处理)

Ruby学习笔记4(范围,迭代器,异常处理)

作者: exialym | 来源:发表于2016-05-13 20:37 被阅读39次

范围

Ruby中的Range就是给定起点和终点,自动为您生成连续值的方式。

(1..5)        #==> 1, 2, 3, 4, 5
(1...5)       #==> 1, 2, 3, 4
('a'..'d')    #==> 'a', 'b', 'c', 'd'

可以使用to.a方法将这个范围转为数组

range2 = ('bar'..'bat').to_a     #["bar", "bas", "bat"]

有一些实用的方法:

.include?
.min
.reject {|i| i < 5 }
if ((1..10) === 5)
  puts "5 在 (1..10)"
end

还有each方法

迭代器

在Ruby中有两个主要的迭代器:each和collect
each返回集合的每个元素,通常与块结合使用

ary = [1,2,3,4,5]
ary.each do |i|
   puts i
end

collect会返回整个集合,并可以通过块来对每一个元素进行操作

a = [1,2,3,4,5]
b = a.collect{|x| 10*x}
puts b

如果你并不想做任何操作,只是单纯的想复制集合的话就不要用这个了。有个方法叫clone。

异常处理

begin #开始
 
 raise.. #抛出异常
 
rescue [ExceptionType = StandardException] #捕获指定类型的异常 缺省值是StandardException
 $! #表示异常信息
 $@ #表示异常出现的代码位置
else #其余异常
 ..
ensure #不管有没有异常,进入该代码块
 
end #结束

从 begin 到 rescue 中的一切是受保护的。如果代码块执行期间发生了异常,控制会传到 rescue 和 end 之间的块。
对于 begin 块中的每个 rescue 子句,Ruby 把抛出的异常与每个参数进行轮流比较。如果 rescue 子句中命名的异常与当前抛出的异常类型相同,或者是该异常的父类,则匹配成功。
如果异常不匹配所有指定的错误类型,我们可以在所有的 rescue 子句后使用一个 else 子句。

begin
    # 这段代码抛出的异常将被下面的 rescue 子句捕获
rescue
    # 这个块将捕获所有类型的异常
    retry  # 这将把控制移到 begin 的开头
end

retry要谨慎使用,如果你不能保证rescue中的语句可以成功的挽救错误,使用retry会让这段无限执行。

raise
raise "Error Message" 
raise ExceptionType, "Error Message"
raise ExceptionType, "Error Message" condition

raise用于抛出异常
第一种形式简单地重新抛出当前异常(如果没有当前异常则抛出一个 RuntimeError)。这用在传入异常之前需要解释异常的异常处理程序中。
第二种形式创建一个新的 RuntimeError 异常,设置它的消息为给定的字符串。该异常之后抛出到调用堆栈。
第三种形式使用第一个参数创建一个异常,然后设置相关的消息为第二个参数。
第四种形式与第三种形式类似,您可以添加任何额外的条件语句(比如 unless)来抛出异常。

begin 
   #.. 过程
   #.. 抛出异常
rescue 
   #.. 处理错误 
ensure 
   #.. 最后确保执行
   #.. 这总是会执行
end

ensure不管有没有异常都会执行

begin 
   #.. 过程 
   #.. 抛出异常
rescue 
   #.. 处理错误
else
   #.. 如果没有异常则执行
ensure 
   #.. 最后确保执行
   #.. 这总是会执行
end

else在没有异常的情况下执行

def promptAndGet(prompt)
   print prompt
   res = readline.chomp
   throw :quitRequested if res == "!"
   return res
end

catch :quitRequested do
   name = promptAndGet("Name: ")
   age = promptAndGet("Age: ")
   sex = promptAndGet("Sex: ")
   # ..
   # 处理信息
end
#....

在catch执行的过程中,如果遇到同名的throw则跳出catch,否则正常执行完catch。如果不在catch里throw则会报错。
我们可以创建自己的异常类,它必须是Exception 或其子代的子类。

相关文章

  • Ruby学习笔记4(范围,迭代器,异常处理)

    范围 Ruby中的Range就是给定起点和终点,自动为您生成连续值的方式。 可以使用to.a方法将这个范围转为数组...

  • python cookbook学习笔记(1)

    python cookbook学习笔记连载中回调会第4章查看迭代器的用法 反向迭代迭代函数reversed() 4...

  • gulp的配置

    学习笔记整理、总结 一、 sass、ruby、compass之间的关系和作用 sass是css预处理器,是基于ru...

  • 异常处理的写法

    ruby中使用begin rescue end语句描述异常处理 在ruby中,异常及其相关信息都是被作为对象来处理...

  • Python ☞ day 5

    Python学习笔记之 装饰器& 偏函数 & 异常处理 & 断言 & 文件读写 &编码与解码 装饰器 概念:是一个...

  • Ruby 迭代器

  • Ruby语法(异常处理)

    异常处理结构 下面一个简单的示例,演示了捕获除数为零时发生的错误 抛出异常 raise: 简单抛出一个未处理的异常...

  • springboot全局异常处理

    一、单个controller范围的异常处理/** 统一异常处理 @return*/@RequestMapping(...

  • Ruby 语句与控制结构

    迭代器和可枚举对象 迭代器的描述并不准确,像”期待一个关联代码块的方法“这样的描述更加准确一些。迭代器是 Ruby...

  • python学习笔记04

    python学习笔记之04. 迭代器和生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式...

网友评论

    本文标题:Ruby学习笔记4(范围,迭代器,异常处理)

    本文链接:https://www.haomeiwen.com/subject/npdmrttx.html