首页 » Ruby » 【Ruby学习笔记】1:Ruby环境和输入输出

【Ruby学习笔记】1:Ruby环境和输入输出

原文 http://blog.csdn.net/SHU15121856/article/details/79179721

2018-01-28 02:00:47阅读(460)

Ruby和irb安装 安装
yum install ruby
yum install ruby-irb

然后ruby -v可以查看Ruby版本,直接irb就可以进入irb了,它是Ruby的交互式解释器。

使用irb

‘=>’后面给出的是返回值。

[lzh@hostlzh /]$ irb
irb(main):001:0> a=3
=> 3
irb(main):002:0> b=2.13
=> 2.13
irb(main):003:0> a**b
=> 10.3816951625648
irb(main):004:0> exit
[lzh@hostlzh /]$
Ruby脚本

ruby的脚本文件后缀名是.rb。

[lzh@hostlzh /]$ cd /home/lzh/文档/Ruby/
[lzh@hostlzh Ruby]$ touch 1.rb
[lzh@hostlzh Ruby]$ gedit 1.rb

第一行还是要指明解释器在哪,看一下:

[lzh@hostlzh /]$ which ruby
/usr/bin/ruby

书写.rb脚本文件:

#!/usr/bin/ruby
print("your name? ")
name=gets()
puts("Hello,#{name},emmm")
puts("Bye,#{name},6666")

用解释器执行:

[lzh@hostlzh Ruby]$ ruby 1.rb
your name? lzh
Hello,lzh
,emmm
Bye,lzh
,6666
[lzh@hostlzh Ruby]$

可以看到print是不换行的,puts是换行的。但是gets()方法会把换行符一起读进来!所以#{name}取name的值输出出来是带换行的。

Ruby语法极其自由,如写成:

#!/usr/bin/ruby
print "your name? "
name=gets
puts "Hello,#{name},emmm"
puts "Bye,#{name},6666"

也一样跑:

[lzh@hostlzh Ruby]$ ruby 1.rb
your name? SB
Hello,SB
,emmm
Bye,SB
,6666
[lzh@hostlzh Ruby]$

(函数在不需要参数而且没有歧义时括号可以不要)

但是为了减少学习Ruby和学习Python3的成本,我还是都打上的好吧。

Python的哲学就是”做一件事只有一种方法”,而Ruby与之完全相反,推崇用多种方法来解决问题,这也导致了Ruby工程难以多人共同协作。

Ruby是纯粹的面向对象,这是吸引我学习Ruby的一个重要方面(体会一下其它语言中存在的问题),还有想试试Ruby的语法糖。

命令行输入

脚本的一大特性就是应当能直接接受来自命令行的输入,命令行的输入按顺序称为变量ARGV[i],可以像使用其它变量那样使用它。

#!/usr/bin/ruby
puts("第一个参数=#{ARGV[0]},第二个参数=#{ARGV[1]}")
[lzh@hostlzh Ruby]$ ruby 1.rb lzh sb
第一个参数=lzh,第二个参数=sb
[lzh@hostlzh Ruby]$
标准输入输出

标准输入在键盘,标准输出在显示器。

标准输入

gets实际上是STDIN的gets()方法:

#!/usr/bin/ruby
name=STDIN.gets()
puts("Hello,#{name},SB")
[lzh@hostlzh Ruby]$ ruby 1.rb
LZH
Hello,LZH
,SB
[lzh@hostlzh Ruby]$

(哇,真的很OOP)

gets()会留下换行符号的,如果不想要,再.chomp()一下:

#!/usr/bin/ruby
name=STDIN.gets().chomp()
puts("Hello,#{name},SB")
[lzh@hostlzh Ruby]$ ruby 1.rb
LZH
Hello,LZH,SB
[lzh@hostlzh Ruby]$
标准输出

puts实际上是STDOUT的puts()方法:

#!/usr/bin/ruby
name=STDIN.gets().chomp()
STDOUT.puts("Hello,#{name},SB")
[lzh@hostlzh Ruby]$ ruby 1.rb
LZH
Hello,LZH,SB
[lzh@hostlzh Ruby]$

如果不要尾接换行符,用STDOUT的print()方法:

#!/usr/bin/ruby
name=STDIN.gets().chomp()
STDOUT.print("Hello,#{name},SB")
[lzh@hostlzh Ruby]$ ruby 1.rb
LZH
Hello,LZH,SB[lzh@hostlzh Ruby]$

Ruby提供了类似C语言的格式化输出方法,也是使用占位符:

#!/usr/bin/ruby
name=STDIN.gets().chomp()
STDOUT.printf("Hello,%s,SB%d",name,1)
[lzh@hostlzh Ruby]$ ruby 1.rb
lzh
Hello,lzh,SB1[lzh@hostlzh Ruby]$
文件输入输出

也即文件读写,在这之前,先写点东西到文件里:

[lzh@hostlzh Ruby]$ ll -h>tst

看一下:

[lzh@hostlzh Ruby]$ cat tst
总用量 32K
-rw-rw-r--. 1 lzh lzh   63 1月  27 13:32 1.rb
-rw-rw-r--. 1 lzh lzh   64 1月  27 13:31 1.rb~
-rw-rw-r--. 1 lzh lzh 1.1K 1月  26 19:52 first.rb
-rw-rw-r--. 1 lzh lzh 1.1K 1月  26 19:52 first.rb~
-rw-rw-r--. 1 lzh lzh  150 1月  27 00:23 MyFileSys
-rw-rw-r--. 1 lzh lzh   15 1月  26 23:32 MyFileSys~
-rw-rw-r--. 1 lzh lzh  408 1月  27 00:50 sy4.rb
-rw-rw-r--. 1 lzh lzh  405 1月  27 00:50 sy4.rb~
-rw-rw-r--. 1 lzh lzh    0 1月  27 13:36 tst
[lzh@hostlzh Ruby]$
读文件内容

最常用的是File的open()方法。

#!/usr/bin/ruby
file=File.open("./tst", "r")
while (line=file.gets())!=nil
    STDOUT.print(line," 666 66 6 ")
end
file.close()

Ruby中不强制缩进,所以循环这样的语句块需要有end结束。

nil是Ruby中的一个特殊值,表示对象不存在,当然在这里可以把!=nil去掉。

用于简单I/O的方法也可用于所有有权限的文件对象,所以可以用line=file.gets()读入文件中的一行,并且带有换行符。

[lzh@hostlzh Ruby]$ ruby 1.rb
总用量 32K
 666 66 6 -rw-rw-r--. 1 lzh lzh   63 1月  27 13:32 1.rb
 666 66 6 -rw-rw-r--. 1 lzh lzh   64 1月  27 13:31 1.rb~
 666 66 6 -rw-rw-r--. 1 lzh lzh 1.1K 1月  26 19:52 first.rb
 666 66 6 -rw-rw-r--. 1 lzh lzh 1.1K 1月  26 19:52 first.rb~
 666 66 6 -rw-rw-r--. 1 lzh lzh  150 1月  27 00:23 MyFileSys
 666 66 6 -rw-rw-r--. 1 lzh lzh   15 1月  26 23:32 MyFileSys~
 666 66 6 -rw-rw-r--. 1 lzh lzh  408 1月  27 00:50 sy4.rb
 666 66 6 -rw-rw-r--. 1 lzh lzh  405 1月  27 00:50 sy4.rb~
 666 66 6 -rw-rw-r--. 1 lzh lzh    0 1月  27 13:36 tst
 666 66 6 [lzh@hostlzh Ruby]$

另外,也可以使用File.new()方法,传入相同的参数打开文件,但File.new()不能跟块关联。在这个例子里没有区别。

#!/usr/bin/ruby
file=File.new("./tst", "r")
while (line=file.gets())!=nil
    STDOUT.print(line," 666 66 6 ")
end
file.close()

输出是一样的。

打开文件后,也可以用sysread()方法指定从当前文件指针向后读多少个字符。

#!/usr/bin/ruby
f=File.open("tst","r")
if f!=nil
   str=f.sysread(40) #读入40个字符后,文件指针在第41个字符位置
   STDOUT.puts(str)
else
   STDOUT.puts("没能成功打开文件")
end
f.close()
[lzh@hostlzh Ruby]$ ruby 1.rb
总用量 32K
-rw-rw-r--. 1 lzh lzh   63
[lzh@hostlzh Ruby]$

可以用IO.readlines()方法读入指定文件的每一行到数组中,不会自带换行符。也不涉及打开文件和文件指针等问题。

#!/usr/bin/ruby
arr=IO.readlines("tst")
STDOUT.puts(arr[0])
STDOUT.puts(arr[1])
STDOUT.puts(arr[3])
STDOUT.puts(arr[1])
[lzh@hostlzh Ruby]$ ruby 1.rb
总用量 32K
-rw-rw-r--. 1 lzh lzh   63 1月  27 13:32 1.rb
-rw-rw-r--. 1 lzh lzh 1.1K 1月  26 19:52 first.rb
-rw-rw-r--. 1 lzh lzh   63 1月  27 13:32 1.rb
[lzh@hostlzh Ruby]$

方法IO.foreach()之于方法IO.readlines(),就如方法File.open()之于方法File.new()。前者都是可以跟块关联的,块具体怎么用后面再学。

#!/usr/bin/ruby
IO.foreach("tst"){|line| puts line}
[lzh@hostlzh Ruby]$ ruby 1.rb
总用量 32K
-rw-rw-r--. 1 lzh lzh   63 1月  27 13:32 1.rb
-rw-rw-r--. 1 lzh lzh   64 1月  27 13:31 1.rb~
-rw-rw-r--. 1 lzh lzh 1.1K 1月  26 19:52 first.rb
-rw-rw-r--. 1 lzh lzh 1.1K 1月  26 19:52 first.rb~
-rw-rw-r--. 1 lzh lzh  150 1月  27 00:23 MyFileSys
-rw-rw-r--. 1 lzh lzh   15 1月  26 23:32 MyFileSys~
-rw-rw-r--. 1 lzh lzh  408 1月  27 00:50 sy4.rb
-rw-rw-r--. 1 lzh lzh  405 1月  27 00:50 sy4.rb~
-rw-rw-r--. 1 lzh lzh    0 1月  27 13:36 tst
[lzh@hostlzh Ruby]$
写入文件

打开的文件对象的syswrite()方法可以向文件写入内容,写入的方式取决与打开时的写方法。

r+形式的读写模式文件指针会放在开头,写的内容会随指针移动覆盖之前的内容:

#!/usr/bin/ruby
f=File.new("tst","r+")
if f!=nil
   f.syswrite("LZH\nSBSBSBSBSSB\nSBBBBB")
else
   STDOUT.puts("无法获取文件对象")
end
f.close()
[lzh@hostlzh Ruby]$ ruby 1.rb
[lzh@hostlzh Ruby]$ cat tst
LZH
SBSBSBSBSSB
SBBBBB--. 1 lzh lzh   63 1月  27 13:32 1.rb
-rw-rw-r--. 1 lzh lzh   64 1月  27 13:31 1.rb~
-rw-rw-r--. 1 lzh lzh 1.1K 1月  26 19:52 first.rb
-rw-rw-r--. 1 lzh lzh 1.1K 1月  26 19:52 first.rb~
-rw-rw-r--. 1 lzh lzh  150 1月  27 00:23 MyFileSys
-rw-rw-r--. 1 lzh lzh   15 1月  26 23:32 MyFileSys~
-rw-rw-r--. 1 lzh lzh  408 1月  27 00:50 sy4.rb
-rw-rw-r--. 1 lzh lzh  405 1月  27 00:50 sy4.rb~
-rw-rw-r--. 1 lzh lzh    0 1月  27 13:36 tst
[lzh@hostlzh Ruby]$

w只写模式,或者w+形式的读写模式,都会重写已经存在的文件,或者是新建并未存在的文件。

#!/usr/bin/ruby
f=File.new("tst","w+")
if f!=nil
   f.syswrite("怎么还不放假\n确实 强啊\t666")
else
   STDOUT.puts("无法获取文件对象")
end
f.close()
[lzh@hostlzh Ruby]$ ruby 1.rb
[lzh@hostlzh Ruby]$ cat tst
怎么还不放假
确实 强啊   666[lzh@hostlzh Ruby]$
输出到字符串

和C语言很像,sprintf()方法可以格式化输出给字符串,当然普通的不需要占位符的也可以用这个方法,所以只有这一个而没有什么”sputs()”这样的方法。

#!/usr/bin/ruby
name=STDIN.gets().chomp()
str=sprintf("Hello,%s,SB%d",name,1)
STDOUT.puts(str)
[lzh@hostlzh Ruby]$ ruby 1.rb
1221assad
Hello,1221assad,SB1
[lzh@hostlzh Ruby]$

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹