博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
有趣的Ruby-学习笔记6
阅读量:3557 次
发布时间:2019-05-20

本文共 4797 字,大约阅读时间需要 15 分钟。

Ruby 文件的输入与输出

Ruby的文件操作都依靠IO类,File类是IO类的子类,所以也可以用File对象来调用IO的方法
最常见的puts自不必多说

gets语句

puts "请输入名字"name = getsputs "hello #{name}"

打开和关闭文件

File.new 和 File.open 的唯一区别是 File.open 后面可以跟 block (我觉得一直用File.new就好了, File.open 会让语句看起来可读性降低)
aFile = File.new("filename", "mode")   # ... 处理文件aFile.closeFile.open("filename", "mode") do |aFile|   # ... process the fileend
文件的读写模式就是 r, r+, w, w+, a, a+

读取和写入文件

sysread

用以下方式可以读入20个字节的文字,在读取大文件的时候很有用,读取小文件可以直接用 IO.read 更简单
aFile = File.new("input.txt", "r")if aFile   content = aFile.sysread(20)   puts contentelse   puts "Unable to open file!"end
syswrite是sysread的对称方法

File.read 一次读入整个文件内容

Dir.chdir "/cygdrive/d/workspace/RubyWorkspace"content = File.read "test.txt"puts content
注意:ruby 中调用方法的参数既可以放到括号里面也可以不放到括号里面,很灵活,也很乱!

each_byte

单个字符的处理
aFile = File.new("input.txt", "r+")if aFile   aFile.syswrite("ABCDEF")   aFile.rewind   aFile.each_byte {|ch| putc ch; putc ?. }else   puts "Unable to open file!"end

IO.readlines 方法

通过该方法可以把文件读成一个数组(非常实用)
arr = IO.readlines("input.txt")puts arr[0]puts arr[1]

IO.foreach 方法

改方法就是readlines的简洁版,可以在一句话直接把要处理的事情都写完
IO.foreach("input.txt"){|block| puts block}

重命名、删除修改文件所有权

rename, delete 和 chmod  具体可以查询手册

查询文件

Ruby提供了大量的非常实用的方法(非常实用!)
  • 通过File::exists? 可以判断是否文件存在
  • File.file? 判断是否是一个文件
  • File::directory? 判断是否是一个文件夹
  • File.readable? 判断文件是否可读
  • File.writable? 判断文件是否可写
  • File.executable? 判断文件是否是执行文件
  • File.zero? 判断文件是否大小为零
  • File.size? 返回文件大小
  • File.ftype 返回文件的类型 (注意:以下开始不带问号了)
  • File::ctime 返回文件的创建时间
  • File::mtime 返回文件的修改时间
  • File::atime 返回文件的最后被访问时间
双冒号 :: 跟 点号 . 的选择是很随意的,不必拘泥,同一个地方用这两种都可以
puts File::exists?("/cygdrive/d/workspace/RubyWorkspace/test.txt")puts File.file?("/cygdrive/d/workspace/RubyWorkspace/test.txt")puts File::directory?("/cygdrive/d/workspace/RubyWorkspace/test.txt")puts File.readable?("/cygdrive/d/workspace/RubyWorkspace/test.txt")puts File::writable?("/cygdrive/d/workspace/RubyWorkspace/test.txt")puts File.executable?("/cygdrive/d/workspace/RubyWorkspace/test.txt")puts File::zero?("/cygdrive/d/workspace/RubyWorkspace/test.txt")puts File.size?("/cygdrive/d/workspace/RubyWorkspace/test.txt")puts File::ftype("/cygdrive/d/workspace/RubyWorkspace/test.txt")puts File.ctime("/cygdrive/d/workspace/RubyWorkspace/test.txt")puts File.atime("/cygdrive/d/workspace/RubyWorkspace/test.txt")

Ruby中的目录

ruby操作目录也是简单的令人发指(非常实用)
# chdir 可以切换目录Dir.chdir("/cygdrive/d/workspace/RubyWorkspace/")puts File.file?("test.txt")#pwd 可以看当前目录的路径puts Dir.pwd#entries 可以列出指定目录中的文件和目录列表puts Dir.entries("/cygdrive/d/workspace/RubyWorkspace/")#foreach 可以对指定目录中的文件和目录进行操作Dir.foreach("/cygdrive/d/workspace/RubyWorkspace/") do |entry|   puts entryend#Dir[] 是entries更简洁的用法,注意那个 *  号,这样获取到的数组是带上完整路径的文件列表files = Dir['/cygdrive/d/workspace/RubyWorkspace/*']puts files#mkdir 可以创建目录Dir.mkdir( "mynewdir", 755 )#Dir.delete 可用于删除目录Dir.delete("mynewdir")
Ruby为每种情况基本都设计了方法,需要做什么事情的时候查一下手册基本都能解决,十分的方便

Ruby 异常

没有异常处理机制的程序是痛苦的。不过Ruby的异常做的有点怪(相比起java)
begin #开始  raise.. #抛出异常 rescue [ExceptionType = StandardException] #捕获指定类型的异常 缺省值是StandardException $! #表示异常信息 $@ #表示异常出现的代码位置else #其余异常 ..ensure #不管有没有异常,进入该代码块 end #结束
实际例子
begin #开始	#试图打开一个不存在的文件,注意,其实直接调用open也可以!Ruby实在太乱了!不过 open 返回的是File对象而不是文件内容	file = open('/cygdrive/d/workspace/notexists')	if file		puts "文件打开正常,path=#{file.path}"	endrescue Errno::ENOENT => e #文件打不开的具体异常类型是这种,很奇怪把!	#STDIN 是标准输入,此处意思是如果拿不到File对象就用标准输入对象代替,并没有什么特别的用意	file = STDIN	puts "这是一种Errno::ENOENT" 	puts	#用 e.inspect可以看到具体的异常类型 	puts "e.inspect #{e.inspect}"	puts	# 用 e.message 可以打印出信息	puts "e.message: #{e.message}"	puts	#用 e.backtrace.inspect 可以打印出堆栈	puts "e.backtrace.inspect: #{e.backtrace.inspect}"	puts	puts "异常信息: #{$!}"	puts	puts "异常代码位置: #{$@}"rescue StandardError => e #获取e对象	#STDIN 是标准输入,此处意思是如果拿不到File对象就用标准输入对象代替,并没有什么特别的用意	file = STDIN	puts "这是一种StandardError" #默认都是StandardErrorrescue => e #还可以直接不写类型,意思是所有类型,相当于else了	#STDIN 是标准输入,此处意思是如果拿不到File对象就用标准输入对象代替,并没有什么特别的用意	file = STDIN	puts "不知道是什么类型的Error"ensure	puts "怎样都会进入的代码"end #结束#逗号隔开并不是连在一起输出,而是多次调用print方法的意思print file, " == ", STDIN

retry

retry 可以放在rescue 里面,会跳到begin处再执行,但是极易发生死循环,请不要使用

raise

用raise可以手动抛出异常

Catch 和 Throw

这里的Catch和Throw 并不是java里面的抛出异常和拦截异常,而是从程序的某个点快速跳出程序块。而且需要用上 symbol特性作为标定位置,有点类似 js 里面的 defer
def promptAndGet(prompt)   print prompt   res = readline.chomp   throw :quitRequested if res == "!"   return resendcatch :quitRequested do   name = promptAndGet("Name: ")   age = promptAndGet("Age: ")   sex = promptAndGet("Sex: ")   # ..   # 处理信息endpromptAndGet("Class:")
这段的意思是 catch 这个块内的代码先于 promptAndGet("Class:") 执行了,当执行中遇到 throw,则跳出
整个catch块
所以在Ruby里面throw和catch跟java的概念完全不一样
不仅执行的逻辑顺序不一样而且使用的时候也并不代表发生错误了,而是存粹为了跳出块,但是为了程序的不容易出bug,建议还是不要这样搞了
如果硬要说有什么类似的语法,那只能说是goto了

自己创建Exception

自己创建Exception并没有什么难的只需要继承 类 Exception 或其子代的子类。
顶层的Exception有7个子类
  • Interrupt
  • NoMemoryError
  • SignalException
  • ScriptError
  • StandardError
  • SystemExit

转载地址:http://mcdrj.baihongyu.com/

你可能感兴趣的文章
前端网页学习7(css背景属性)
查看>>
前端网页学习8(css三大特性:层叠性,继承性,优先级)
查看>>
前端网页学习9(css盒子)
查看>>
python学习8(列表)
查看>>
JavaScript学习(new1)
查看>>
http GET 和 POST 请求的优缺点、区别以及误区
查看>>
JVM的4种垃圾回收算法、垃圾回收机制
查看>>
什么是分布式事务
查看>>
常用的分布式事务解决方案
查看>>
设计模式:单例模式 (关于饿汉式和懒汉式)
查看>>
一致性Hash算法
查看>>
更新Navicat Premium 后打开数据库出现1146 - Table 'performance_schema.session_variables' doesn't exist
查看>>
安装rabbitmq时踩的坑
查看>>
2021-06-09数据库添加多条数据
查看>>
简单的JAVA小作品
查看>>
CMake下载
查看>>
未调用fflush产生的图片文件无法打开问题
查看>>
SQL 约束(二)
查看>>
SQL ALTER用法(三)
查看>>
SQL where子句及查询条件语句(六)
查看>>