3.1 命令行的输入数据
到目前为止,我们写的程序都是向屏幕输出数据。现在我们考虑一下怎么输入数据。
代码示例:
执行结果:
如图可以看出,执行命令 ruby print_argv.rb 1st 2nd 3rd
中所传递的 1st 2nd 3rd
这三个参数(在命令行指定多个脚本参数时,各参数之间用空格间隔),可以用 #{ARGV[0]}
这种方式获取。(其中 ARGV 是 Ruby 预定义好的数组)
使用 ARGV 后,程序需要用到的数据就不必都写在代码中。同时,抽取数据、保存数据等普通的数组操作对于 ARGV 都是适用的。
代码示例:
执行示例:
把字符串转换为整数,可以使用 to_i
方法。
代码示例:
执行示例:
3.2 文件的读取
Ruby 脚本除了读取命令行传递过来的字符串参数外,还可以读取预先写在文件里的数据。
Ruby 的源代码中,有一个名为 ChangeLog 的文本文件。文件里面记录了Ruby相关的修改日志。
备注Ruby的源代码可以从Ruby官网下载。ChangeLog 文件可以在Ruby的github库里找到。
• Ruby源码下载地址:https://www.ruby-lang.org/zh_cn/downloads/ • github上的ChangeLog文件地址:https://raw.github.com/ruby/ruby/v2_0_0_0/ChangeLog
3.2.1 从文件中读取内容并输出
读取文件内容的流程:
- 打开文件
- 读取文件的文本数据
- 输出文件的文本数据
- 关闭文件
代码示例:
执行示例:
如果只是读取文件内容,其实直接适用 read 方法会使程序更简单
代码示例:
执行示例:
更进一步,如果不使用变量,一行代码就可以到搞定啦。
3.2.2 从文件中逐行读取内容并输出
一下子读取全部文件 耗时,浪费内存(读取的内容会保存在内存中,遇到大文件,程序会崩溃)
所以需要 放弃 「 读取文件全部内容 」 ,改为 「 逐行读取并输出 」。
如图:read 和 each_line 的区别
代码示例:
3.2.3 从文件中读取指定模式的内容并输出
用 Ruby 实现 grep 命令 ( Unix中有一个 grep 命令 ,grep 命令利用正则表达式搜索文本数据,输出按照指定模式匹配到的行 )
代码示例:
执行示例:
图中 ,命令 ruby simple_grep.rb filename read_text.rb
的意思就是执行 simple_grep.rb 程序,第一个参数为要匹配的字符串 我这里是 filename
,第二个参数为 要搜索的文本文件 我这里是 read_text.rb
,执行结果,就是这个 read_text.rb
中的两行包含的 filename
数据。
3.3 方法的定义
定义方法:
def 方法名
希望执行的处理
end
定义好方法后,需要 「 调用 」,Ruby 才知道我们要执行这个方法。
代码示例:
执行示例:
3.4 其他文件的引用
被其他程序引用的程序,成为库(library)。
Ruby 使用 require
方法引用库:
require 希望使用的库名
库名可疑省略后缀 .rb
如图:库与引用库的程序
把 simple_grep.rb 作为库供给其他程序使用。
代码示例:
注:库与脚本放在同一文件夹时,需要用 ./
来明示文件存放在当前目录。
执行示例:
Ruby 提供了很多标准库,我们可以通过 require
来引用。
如图:计算出了Ruby的生日——1993年2月24到今天为止的天数:8622
pp 方法
除了 p 方法外,Ruby 还提供了一个类似的方法——pp(pretty print)。
使用 pp 方法,需要引用 pp 库。
代码示例:
示例代码:
我没发现有啥区别。。。但是书上说,pp方法会在输出对象的结果时,会适当的换行以调整输出结果,可以更容易看懂。。。