Ruby 教程--基础教程(2/10)

Ruby 中文编码

前面章节中我们已经学会了如何用 Ruby 输出 "Hello, World!",英文没有问题,但是如果你输出中文字符"你好,世界"就有可能会碰到中文编码问题。

Ruby 文件中如果未指定编码,在执行过程会出现报错:

#!/usr/bin/ruby -w

puts "你好,世界!";

以上程序执行输出结果为:

invalid multibyte char (US-ASCII) 

以上出错信息显示了 Ruby 使用用 ASCII 编码来读源码,中文会出现乱码,解决方法为只要在文件开头加入 # -*- coding: UTF-8 -*-(EMAC写法) 或者 #coding=utf-8 就行了。

实例

#!/usr/bin/ruby -w # -*- coding: UTF-8 -*- puts "你好,世界!";

输出结果为:

你好,世界!

所以如果大家再学习过程中,源代码文件中,若包含中文编码,则需要注意两点:

  • 1. 必须在首行添加 # -*- coding: UTF-8 -*-,告诉解释器使用utf-8来解析源码。
  • 2. 必须设置编辑器保存文件的编码为utf-8。

Ruby 命令行选项

Ruby 一般是从命令行运行,方式如下:

$ ruby [ options ] [.] [ programfile ] [ arguments ... ]

解释器可以通过下列选项被调用,来控制解释器的环境和行为。

选项描述
-a与 -n 或 -p 一起使用时,可以打开自动拆分模式(auto split mode)。请查看 -n 和 -p 选项。
-c只检查语法,不执行程序。
-C dir在执行前改变目录(等价于 -X)。
-d启用调试模式(等价于 -debug)。
-F pat指定 pat 作为默认的分离模式($;)。
-e prog指定 prog 作为程序在命令行中执行。可以指定多个 -e 选项,用来执行多个程序。
-h显示命令行选项的一个概览。
-i [ ext]把文件内容重写为程序输出。原始文件会被加上扩展名 ext 保存下来。如果未指定 ext,原始文件会被删除。
-I dir添加 dir 作为加载库的目录。
-K [ kcode]指定多字节字符集编码。e 或 E 对应 EUC(extended Unix code),s 或 S 对应 SJIS(Shift-JIS),u 或 U 对应 UTF-8,a、A、n 或 N 对应 ASCII。
-l启用自动行尾处理。从输入行取消一个换行符,并向输出行追加一个换行符。
-n把代码放置在一个输入循环中(就像在 while gets; ... end 中一样)。
-0[ octal]设置默认的记录分隔符($/)为八进制。如果未指定 octal 则默认为 \0。
-p把代码放置在一个输入循环中。在每次迭代后输出变量 $_ 的值。
-r lib使用 require 来加载 lib 作为执行前的库。
-s解读程序名称和文件名参数之间的匹配模式 -xxx 的任何参数作为开关,并定义相应的变量。
-T [level]设置安全级别,执行不纯度测试(如果未指定 level,则默认值为 1)。
-v显示版本,并启用冗余模式。
-w启用冗余模式。如果未指定程序文件,则从 STDIN 读取。
-x [dir]删除 #!ruby 行之前的文本。如果指定了 dir,则把目录改变为 dir
-X dir在执行前改变目录(等价于 -C)。
-y启用解析器调试模式。
--copyright显示版权声明。
--debug启用调试模式(等价于 -d)。
--help显示命令行选项的一个概览(等价于 -h)。
--version显示版本。
--verbose启用冗余模式(等价于 -v)。设置 $VERBOSE 为 true。
--yydebug启用解析器调试模式(等价于 -y)。

单字符的命令行选项可以组合使用。下面两行表达了同样的意思:

$ ruby -ne 'print if /Ruby/' /usr/share/bin


$ ruby -n -e 'print if /Ruby/' /usr/share/bin

Ruby 环境变量

Ruby 解释器使用下列环境变量来控制它的行为。ENV 对象包含了所有当前设置的环境变量列表。

变量描述
DLN_LIBRARY_PATH动态加载模块搜索的路径。
HOME当没有参数传递给 Dir::chdir 时,要移动到的目录。也用于 File::expand_path 来扩展 "~"。
LOGDIR当没有参数传递给 Dir::chdir 且未设置环境变量 HOME 时,要移动到的目录。
PATH执行子进程的搜索路径,以及在指定 -S 选项后,Ruby 程序的搜索路径。每个路径用冒号分隔(在 DOS 和 Windows 中用分号分隔)。
RUBYLIB库的搜索路径。每个路径用冒号分隔(在 DOS 和 Windows 中用分号分隔)。
RUBYLIB_PREFIX用于修改 RUBYLIB 搜索路径,通过使用格式 path1;path2 或 path1path2,把库的前缀 path1 替换为 path2。
RUBYOPT传给 Ruby 解释器的命令行选项。在 taint 模式时被忽略(其中,$SAFE 大于 0)。
RUBYPATH指定 -S 选项后,Ruby 程序的搜索路径。优先级高于 PATH。在 taint 模式时被忽略(其中,$SAFE 大于 0)。
RUBYSHELL指定执行命令时所使用的 shell。如果未设置该环境变量,则使用 SHELL 或 COMSPEC。

对于 Unix,使用 env 命令来查看所有环境变量的列表。

HOSTNAME=ip-72-167-112-17.ip.secureserver.net
RUBYPATH=/usr/bin
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
SSH_CLIENT=122.169.131.179 1742 22
SSH_TTY=/dev/pts/1
USER=amrood
JRE_HOME=/usr/java/jdk/jre
J2RE_HOME=/usr/java/jdk/jre
PATH=/usr/local/bin:/bin:/usr/bin:/home/guest/bin
MAIL=/var/spool/mail/guest
PWD=/home/amrood
INPUTRC=/etc/inputrc
JAVA_HOME=/usr/java/jdk
LANG=C
HOME=/root
SHLVL=2
JDK_HOME=/usr/java/jdk
LOGDIR=/usr/log/ruby
LOGNAME=amrood
SSH_CONNECTION=122.169.131.179 1742 72.167.112.17 22
LESSOPEN=|/usr/bin/lesspipe.sh %s
RUBYLIB=/usr/lib/ruby
G_BROKEN_FILENAMES=1
_=/bin/env

Ruby 语法

让我们编写一个简单的 Ruby 程序。所有的 Ruby 文件扩展名都是 .rb。所以,把下面的源代码放在 test.rb 文件中。

实例

#!/usr/bin/ruby -w puts "Hello, Ruby!";

在这里,假设您的 /usr/bin 目录下已经有可用的 Ruby 解释器。现在,尝试运行这个程序,如下所示:

$ ruby test.rb

这将会产生下面的结果:

Hello, Ruby!

您已经看到了一个简单的 Ruby 程序,现在让我们看看一些 Ruby 语法相关的基本概念:

Ruby 程序中的空白

在 Ruby 代码中的空白字符,如空格和制表符一般会被忽略,除非当它们出现在字符串中时才不会被忽略。然而,有时候它们用于解释模棱两可的语句。当启用 -w 选项时,这种解释会产生警告。

实例:

a + b 被解释为 a+b (这是一个局部变量)
a  +b 被解释为 a(+b) (这是一个方法调用)

Ruby 程序中的行尾

Ruby 把分号和换行符解释为语句的结尾。但是,如果 Ruby 在行尾遇到运算符,比如 +、- 或反斜杠,它们表示一个语句的延续。

Ruby 标识符

标识符是变量、常量和方法的名称。Ruby 标识符是大小写敏感的。这意味着 Ram 和 RAM 在 Ruby 中是两个不同的标识符。

Ruby 标识符的名称可以包含字母、数字和下划线字符( _ )。

保留字

下表列出了 Ruby 中的保留字。这些保留字不能作为常量或变量的名称。但是,它们可以作为方法名。

BEGINdonextthen
ENDelseniltrue
aliaselsifnotundef
andendorunless
beginensureredountil
breakfalserescuewhen
caseforretrywhile
classifreturnyield
definself__FILE__
defined?modulesuper__LINE__

Ruby 中的 Here Document

"Here Document" 是指建立多行字符串。在 << 之后,您可以指定一个字符串或标识符来终止字符串,且当前行之后直到终止符为止的所有行是字符串的值。

如果终止符用引号括起,引号的类型决定了面向行的字符串类型。请注意<< 和终止符之间必须没有空格。

下面是不同的实例:

实例

#!/usr/bin/ruby -w # -*- coding : utf-8 -*- print <<EOF 这是第一种方式创建here document 。 多行字符串。 EOF print <<"EOF"; # 与上面相同 这是第二种方式创建here document 。 多行字符串。 EOF print <<`EOC` # 执行命令 echo hi there echo lo there EOC print <<"foo", <<"bar" # 您可以把它们进行堆叠 I said foo. foo I said bar. bar

这将产生以下结果:

这是第一种方式创建here document 。
多行字符串。
这是第二种方式创建here document 。
多行字符串。
hi there
lo there
I said foo.
I said bar.

Ruby BEGIN 语句

语法

BEGIN {
   code
}

声明 code 会在程序运行之前被调用。

实例

#!/usr/bin/ruby puts "这是主 Ruby 程序" BEGIN { puts "初始化 Ruby 程序" }

这将产生以下结果:

初始化 Ruby 程序
这是主 Ruby 程序

Ruby END 语句

语法

END {
   code
}

声明 code 会在程序的结尾被调用。

实例

#!/usr/bin/ruby puts "这是主 Ruby 程序" END { puts "停止 Ruby 程序" } BEGIN { puts "初始化 Ruby 程序" }

这将产生以下结果:

初始化 Ruby 程序
这是主 Ruby 程序
停止 Ruby 程序

Ruby 注释

注释会对 Ruby 解释器隐藏一行,或者一行的一部分,或者若干行。您可以在行首使用字符( # ):

# 我是注释,请忽略我。

或者,注释可以跟着语句或表达式的同一行的后面:

name = "Madisetti" # 这也是注释

您可以注释多行,如下所示:

# 这是注释。 # 这也是注释。 # 这也是注释。 # 这还是注释。

下面是另一种形式。这种块注释会对解释器隐藏 =begin/=end 之间的行:

=begin 这是注释。 这也是注释。 这也是注释。 这还是注释。 =end

here document 介绍

构建一个 here document 最通用的语法是 << 紧跟一个标识符,从下一行开始是想要引用的文字,然后再在单独的一行用相同的标识符关闭。

puts <<EOF
这是第一行
这是第二行
EOF

执行输出结果为:

这是第一行
这是第二行

更多用法可查看以下实例:

#!/usr/bin/ruby -w
# -*- coding : utf-8 -*-

#(<<)here doucument 感觉本来单行是一个整体变成是一种多行作为一个整体进行导入的方式和 sh 语法相似

print <<EOF
    这是第一种方式创建 here document
    多行字符串。
EOF

print <<"EOF";                # 与上面相同
    这是第二种方式创建here document
    多行字符串。
EOF

print <<`EOC`                 # 执行命令
    ls -al;
    ps -a
EOC

print <<"foo", <<"bar"          # 您可以把它们进行堆叠
    I said foo.
foo
    I said bar.
bar
text =  <<`foo`            # 您可以把它们进行转存
    cat /etc/passwd
foo

puts text

File.open("/home/abc","w") do |io|
    io.write(text)
end
puts "------------------------"
exec "ls -al /home/ && cat /home/abc"

Ruby 数据类型

本章节我们将为大家介绍 Ruby 的基本数据类型。

Ruby支持的数据类型包括基本的Number、String、Ranges、Symbols,以及true、false和nil这几个特殊值,同时还有两种重要的数据结构——Array和Hash。


数值类型(Number)

1、整型(Integer)

整型分两种,如果在31位以内(四字节),那为Fixnum实例。如果超过,即为Bignum实例。

整数范围从 -230 到 230-1,在这个范围内的整数是类 Fixnum 的对象, 当整数值大于或等于2的30次方时( -262 到 262-1),会自动转化为 Bignum 类型。

您可以在整数前使用一个可选的前导符号,一个可选的基础指标(0 对应 octal,0x 对应 hex,0b 对应 binary),后跟一串数字。下划线字符在数字字符串中被忽略。

您可以获取一个 ASCII 字符或一个用问号标记的转义序列的整数值。

实例

123 # Fixnum 十进制 1_234 # Fixnum 带有下划线的十进制 -500 # 负的 Fixnum 0377 # 八进制 0xff # 十六进制 0b1011 # 二进制 "a".ord # "a" 的字符编码 ?\n # 换行符(0x0a)的编码 12345678901234567890 # 大数 #整型 Integer 以下是一些整型字面量 #字面量(literal):代码中能见到的值,数值,bool值,字符串等都叫字面量 #如以下的0,1_000_000,0xa等 a1=0 #带千分符的整型 a2=1_000_000 #其它进制的表示 a3=0xa puts a1,a2 puts a3 #puts print 都是向控制台打印字符,其中puts带回车换行符 =begin 这是注释,称作:嵌入式文档注释 类似C#中的/**/ =end

浮点型

Ruby 支持浮点数。它们是带有小数的数字。浮点数是类 Float 的对象,且可以是下列中任意一个。

实例

实例

123.4 # 浮点值 1.0e6 # 科学记数法 4E20 # 不是必需的 4e+20 # 指数前的符号 #浮点型 f1=0.0 f2=2.1 f3=1000000.1 puts f3

算术操作

加减乘除操作符:+-*/;指数操作符为**

指数不必是整数,例如

实例

#指数算术 puts 2**(1/4)#1与4的商为0,然后2的0次方为1 puts 16**(1/4.0)#1与4.0的商为0.25(四分之一),然后开四次方根


字符串类型

Ruby 字符串简单地说是一个 8 位字节序列,它们是类 String 的对象。

双引号标记的字符串允许替换和使用反斜线符号,单引号标记的字符串不允许替换,且只允许使用 \\ 和 \' 两个反斜线符号。

实例

#!/usr/bin/ruby -w puts 'escape using "\\"'; puts 'That\'s right';

这将产生以下结果:

escape using "\"
That's right

您可以使用序列 #{ expr } 替换任意 Ruby 表达式的值为一个字符串。在这里,expr 可以是任意的 Ruby 表达式。

实例

#!/usr/bin/ruby -w puts "相乘 : #{24*60*60}";

这将产生以下结果:

相乘 : 86400

实例

#!/usr/bin/ruby -w name="Ruby" puts name puts "#{name+",ok"}"

输出结果为:

Ruby
Ruby,ok

反斜线符号

下表列出了 Ruby 支持的反斜线符号:

符号表示的字符
\n换行符 (0x0a)
\r回车符 (0x0d)
\f换页符 (0x0c)
\b退格键 (0x08)
\a报警符 Bell (0x07)
\e转义符 (0x1b)
\s空格符 (0x20)
\nnn八进制表示法 (n 是 0-7)
\xnn十六进制表示法 (n 是 0-9、a-f 或 A-F)
\cx, \C-xControl-x
\M-xMeta-x (c | 0x80)
\M-\C-xMeta-Control-x
\x字符 x

如需了解更多有关 Ruby 字符串的细节,请查看 Ruby 字符串(String)

数组

数组字面量通过[]中以逗号分隔定义,且支持range定义。

  • (1)数组通过[]索引访问
  • (2)通过赋值操作插入、删除、替换元素
  • (3)通过+,-号进行合并和删除元素,且集合做为新集合出现
  • (4)通过<<号向原数据追加元素
  • (5)通过*号重复数组元素
  • (6)通过|和&符号做并集和交集操作(注意顺序)

实例

#!/usr/bin/ruby ary = [ "fred", 10, 3.14, "This is a string", "last element", ] ary.each do |i| puts i end

这将产生以下结果:

fred
10
3.14
This is a string
last element

哈希类型

Ruby 哈希是在大括号内放置一系列键/值对,键和值之间使用逗号和序列 => 分隔。尾部的逗号会被忽略。

实例

实例

#!/usr/bin/ruby hsh = colors = { "red" => 0xf00, "green" => 0x0f0, "blue" => 0x00f } hsh.each do |key, value| print key, " is ", value, "\n" end

这将产生以下结果:

red is 3840
green is 240
blue is 15

范围类型

一个范围表示一个区间。

范围是通过设置一个开始值和一个结束值来表示。范围可使用 s..e 和 s...e 来构造,或者通过 Range.new 来构造。

使用 .. 构造的范围从开始值运行到结束值(包含结束值)。使用 ... 构造的范围从开始值运行到结束值(不包含结束值)。当作为一个迭代器使用时,范围会返回序列中的每个值。

范围 (1..5) 意味着它包含值 1, 2, 3, 4, 5,范围 (1...5) 意味着它包含值 1, 2, 3, 4 。

实例

#!/usr/bin/ruby (10..15).each do |n| print n, ' ' end

这将产生以下结果:

10 11 12 13 14 15

Ruby 类和对象

Ruby 是一种完美的面向对象编程语言。面向对象编程语言的特性包括:

  • 数据封装
  • 数据抽象
  • 多态性
  • 继承

一个面向对象的程序,涉及到的类和对象。类是个别对象创建的蓝图。在面向对象的术语中,您的自行车是自行车类的一个实例。

以车辆为例,它包括车轮(wheels)、马力(horsepower)、燃油或燃气罐容量(fuel or gas tank capacity)。这些属性形成了车辆(Vehicle)类的数据成员。借助这些属性您能把一个车辆从其他车辆中区分出来。

车辆也能包含特定的函数,比如暂停(halting)、驾驶(driving)、超速(speeding)。这些函数形成了车辆(Vehicle)类的数据成员。因此,您可以定义类为属性和函数的组合。

类 Vehicle 的定义如下:

实例

Class Vehicle { Number no_of_wheels Number horsepower Characters type_of_tank Number Capacity Function speeding { } Function driving { } Function halting { } }

通过给这些数据成员分配不同的值,您可以创建类 Vehicle 的不同实例。例如,一架飞机有三个轮子,马力 1,000,燃油罐容量为 100 升。以同样的方式,一辆汽车有四个轮子,马力 200,煤气罐容量为 25 升。

在 Ruby 中定义类

为了使用 Ruby 实现面向对象编程,您需要先学习如何在 Ruby 中创建对象和类。

在 Ruby 中,类总是以关键字 class 开始,后跟类的名称。类名的首字母应该大写。类 Customer 如下所示:

class Customer end

您可以使用关键字 end 终止一个类。 中的所有数据成员都是介于类定义和 end 关键字之间。

Ruby 类中的变量

Ruby 提供了四种类型的变量:

  • 局部变量:局部变量是在方法中定义的变量。局部变量在方法外是不可用的。在后续的章节中,您将看到有关方法的更多细节。局部变量以小写字母或 _ 开始。
  • 实例变量:实例变量可以跨任何特定的实例或对象中的方法使用。这意味着,实例变量可以从对象到对象的改变。实例变量在变量名之前放置符号(@)。
  • 类变量:类变量可以跨不同的对象使用。类变量属于类,且是类的一个属性。类变量在变量名之前放置符号(@@)。
  • 全局变量:类变量不能跨类使用。如果您想要有一个可以跨类使用的变量,您需要定义全局变量。全局变量总是以美元符号($)开始。

实例

使用类变量 @@no_of_customers,您可以判断被创建的对象数量,这样可以确定客户数量。

实例

class Customer @@no_of_customers=0 end

在 Ruby 中使用 new 方法创建对象

对象是类的实例。现在您将学习如何在 Ruby 中创建类的对象。在 Ruby 中,您可以使用类的方法 new 创建对象。

方法 new 是一种独特的方法,在 Ruby 库中预定义。new 方法属于方法。

下面的实例创建了类 Customer 的两个对象 cust1 和 cust2:

cust1 = Customer. new cust2 = Customer. new

在这里,cust1 和 cust2 是两个对象的名称。对象名称后跟着等号(=),等号后跟着类名,然后是点运算符和关键字 new

自定义方法来创建 Ruby 对象

您可以给方法 new 传递参数,这些参数可用于初始化类变量。

当您想要声明带参数的 new 方法时,您需要在创建类的同时声明方法 initialize

initialize 方法是一种特殊类型的方法,将在调用带参数的类的 new 方法时执行。

下面的实例创建了 initialize 方法:

实例

class Customer @@no_of_customers=0 def initialize(id, name, addr) @cust_id=id @cust_name=name @cust_addr=addr end end

在本实例中,您可以声明带有 id、name、addr 作为局部变量的 initialize方法。在这里,def 和 end 用于定义 Ruby 方法 initialize。在后续的章节中,您将学习有关方法的更多细节。

在 initialize 方法中,把这些局部变量的值传给实例变量 @cust_id、@cust_name 和 @cust_addr。在这里,局部变量的值是随着 new 方法进行传递的。

现在,您可以创建对象,如下所示:

cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya") cust2=Customer.new("2", "Poul", "New Empire road, Khandala")


Ruby 类中的成员函数

在 Ruby 中,函数被称为方法。中的每个方法是以关键字 def 开始,后跟方法名。

方法名总是以小写字母开头。在 Ruby 中,您可以使用关键字 end 来结束一个方法。

下面的实例定义了一个 Ruby 方法:

class Sample def function statement 1 statement 2 end end

在这里,statement 1 和 statement 2 是类 Sample 内的方法 function 的主体的组成部分。这些语句可以是任何有效的 Ruby 语句。例如,我们可以使用方法 puts 来输出 Hello Ruby,如下所示:

class Sample def hello puts "Hello Ruby!" end end

下面的实例将创建类 Sample 的一个对象,并调用 hello 方法:

#!/usr/bin/ruby class Sample def hello puts "Hello Ruby!" end end # 使用上面的类来创建对象 object = Sample. new object.hello

这将会产生下面的结果:

Hello Ruby!
  • 24
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值