ruby入门
简介
Ruby是一种动态、面向对象、开源的编程语言,它的设计者是松本行弘(Yukihiro "Matz" Matsumoto)。Ruby语言的语法简洁、灵活,使用起来非常方便,常被用于Web开发、网络编程、数据分析、自动化脚本等领域。Ruby语言的特点包括:
- 简单易学:Ruby语言的语法简洁、清晰,易于理解和上手。
- 动态语言:Ruby是一种动态语言,它的变量类型是动态的,在运行时进行类型检查,这使得Ruby程序员能够更快地开发程序。
- 面向对象:Ruby是一种纯面向对象的编程语言,支持类、继承、多态等面向对象的概念。
- 具有强大的元编程能力:Ruby具有强大的元编程能力,可以动态地改变程序的结构和行为。
- 丰富的类库:Ruby具有非常丰富的类库,可以方便地实现各种功能。
- 可移植性:Ruby可以运行在多种操作系统上,如Linux、Windows、MacOS等。
- 开源:Ruby是一种开源的编程语言,任何人都可以免费获取并使用。
总之,Ruby语言具有简单易学、灵活、强大的元编程能力、丰富的类库等特点,适用于各种领域的编程需求。
Ruby和Python相似地方
- 它们都是高级语言。
- 它们都是服务器端脚本语言。
- 两者都用于Web应用程序。
- 两个工作在多个平台上。
- 两者都具有清晰的语法,易于阅读。
- 两者都使用一种叫作
irb的交互式提示。 - 对象都是强大的动态类型。
- 两者都使用嵌入式
doc工具。
Ruby和Python不同之处
Ruby和Python编程语言之间存在许多差异,如下表格列出所示 -
| 术语 | Ruby | Python |
|---|---|---|
| 定义 | Ruby是一种开源的Web应用程序编程语言。 | Python是一种高级编程语言。 |
| 面向对象 | 面向对象编程语言。 | 不完全面向对象的编程语言。 |
| 创始人/开发者 | 松本松本在20世纪90年代。 | Guido Van Rossum在20世纪80年代。 |
| 开发环境 | 支持EclipseIDE | 支持多个IDE |
| 程序库 | 它比Python库更小 | 有较大范围的库 |
| 混合类型 | 可使用混合类型 | 不可使用混合类型 |
| Web框架 | Ruby on Rails | Django |
| 社区 | 主要集中在Web应用 | 专注于学术界和Linux |
| 使用 | 苹果Github上的Twitter Groupon的Shopify ThemeForest | 谷歌Instagram的Mozilla Firefox浏览器,华盛顿邮报,雅虎Shopzilla |
| 内置类 | 内置类可以修改 | 内置类不可以修改 |
| elseif | elsif | elif |
| 取消设置变量 | 一旦设置了变量,就无法将其设置为不可用。只要它在范围内,它将出现在符号表中。 | del语句用于删除一个设置的变量。 |
yield关键字 |
它将执行另一个作为最终参数传递的函数,然后立即恢复。 | 它将执行返回到函数调用之外的范围。外部代码负责恢复功能。 |
| 匿名函数 | 支持块,procs和lambdas表达式。 |
仅支持lambda表达式。 |
| 函数 | 没有函数 | 有函数 |
| 元组 | 它不支持元组 | 支持元组 |
switch/case语句 |
它支持switch/case语句。 |
它不支持switch/case语句 |
lambda函数 |
它的lambda函数更大 |
它只支持单行lambda函数 |
| 继承 | 支持单继承 | 支持多继承 |
hello world程序
puts 'hello world' # 输出字符串并在末尾换行
print 'hello world' # 输出字符串
printf '%s'%'hello world'# 格式化字符串输出
putc 'hello world' #只输出一个字符
运算符
Ruby运算符类型如下所示:
- 一元运算符
- 算术运算符
- 按位运算符
- 逻辑运算符
- 三元运算符
- 赋值运算符
- 比较运算符
- 范围运算符
1. 一元运算符
一元运算符可用在一个操作数上运行。
| 操作符 | 描述 |
|---|---|
! |
布尔非 |
~ |
按位补码 |
+ |
一元加法 |
示例
在文件unary-operator.rb中,写下面的代码。
#!/usr/bin/ruby -w
puts("Unary operator")
puts(~5)
puts(~-5)
puts(!true)
puts(!false)
执行上面代码,得到以下结果 -
-6
4
false
true
2. 算术运算符
算术运算符将数值作为操作数,并将它们作为单个值返回。
| 操作符 | 描述 |
|---|---|
+ |
相加运算符的两边值 |
- |
运算符的两边的值相减,第一个数减去第二个数 |
/ |
用右侧操作数除左侧操作数 |
* |
将运算符的两边值相乘 |
** |
将右侧操作数指定为左侧操作数的指数 |
% |
将左侧操作数除以右侧操作数后返回余数 |
示例
在文件airthmetic-operator.rb中,写下面的代码。
puts("add operator")
puts(10 + 20)
puts("subtract operator")
puts(35 - 15)
puts("multiply operator")
puts(4 * 8)
puts("division operator")
puts(25 / 5)
puts("exponential operator")
puts(5 ** 2)
puts("modulo operator")
puts(25 % 4)
执行上面代码,得到以下结果 -
add operator
30
subtract operator
20
multiply operator
32
division operator
5
exponential operator
25
modulo operator
1
3. 位运算符
按位运算符对位操作数进行操作。
| 操作符 | 描述 |
|---|---|
& |
AND运算符 |
![]() |
OR运算符 |
<< |
左移操作符 |
>> |
右移操作符 |
^ |
异或操作符 |
~ |
补码运算符 |
4. 逻辑运算符
逻辑运算符对位操作数进行操作。
| 操作符 | 描述 |
|---|---|
&& |
AND运算符 |
![]() |
OR运算符 |
5. 三元运算符
三元运算符首先检查给定条件是真还是假,然后再执行对应的条件语句。
| 操作符 | 描述 |
|---|---|
?: |
条件表达式 |
示例
在文件ternary-operator.rb中,编写下面的代码。
puts("Ternary operator")
puts(2<5 ? 5:2)
puts(5<2 ? 5:2)
执行上面代码,得到以下结果 -
Ternary operator
5
2
6. 赋值运算符
赋值运算符用于为操作数分配一个值。
| 操作符 | 描述 |
|---|---|
= |
简单赋值运算符 |
+= |
相加并赋值运算符 |
-= |
相减并赋值运算符 |
*= |
相乘并赋值运算符 |
/= |
相除并赋值运算符 |
%/ |
模除并赋值运算符 |
**= |
指数幂并赋值运算符 |
7. 比较运算符
比较运算符是用于比较两个操作数的大小,相等,不相等,大于,小于等等。
| 操作符 | 描述 |
|---|---|
== |
等于运算符 |
!= |
不等于运算符 |
> |
大于运算符,左操作数大于右操作数? |
< |
小于运算符,右操作数大于左操作数? |
>= |
大于等于运算符,左操作数大于或等于右操作数? |
<= |
小于等于运算符,右操作数大于或等于左操作数? |
<=> |
组合比较运算符 |
.eql? |
检查比较操作数相等和类型是否相同? |
equal? |
检查比较对象ID是否相等 |
示例
在文件comparison-operator.rb中,编写下面的代码。
puts("Comparison operator")
puts(2 == 5)
puts(2 != 5)
puts(2 > 5)
puts(2 < 5)
puts(2 >= 5)
puts(2 <= 5)
执行上面代码,得到以下结果 -
Comparison operator
false
true
false
true
false
true
8. 范围运算符
范围运算符创建一系列连续的值,包括两者之间的值的起始,结束和范围。
(..)创建一个范围,包括最后一个术语,(...)创建一个不包括最后一项的范围。
例如,对于1..5的范围,输出范围为1到5,范围值也就是:1,2,3,4,5。
而对于1 ... 5的范围,输出范围为1到4,范围值也就是:1,2,3,4。
变量
1. 局部变量
局部变量名以小写字母或下划线(_)开头。变量可在它的初始化块内或范围内访问。代码块完成后,变量就不在作用域存在了。
当未初始化的局部变量被调用时,它们被解释为对没有参数的方法的调用。
2. 类变量
类变量名以@@符号开头。需要在使用前进行初始化。 类变量属于整个类,可以从类中的任何位置访问。 如果在一个实例中该值将被更改,则它将在每个实例中被改变。
类变量由类的所有后代共享,未初始化的类变量将导致错误。
示例:
创建一个Ruby文件:class-variables.rb,编写以下代码 -
class States
@@no_of_states=0
def initialize(name)
@states_name=name
@@no_of_states += 1
end
def display()
puts "State name #@state_name"
end
def total_no_of_states()
puts "Total number of states written: #@@no_of_states"
end
end
# Create Objects
first=States.new("Assam")
second=States.new("Meghalaya")
third=States.new("Maharashtra")
fourth=States.new("Pondicherry")
# Call Methods
first.total_no_of_states()
second.total_no_of_states()
third.total_no_of_states()
fourth.total_no_of_states()
在上面的例子中,@@no_of_states是一个类变量。
执行上面代码,输出结果如下:
Total number of states written: 4
Total number of states written: 4
Total number of states written: 4
Total number of states written: 4
3. 实例变量
实例变量名以@符号开头。 它属于类的一个实例,可以从方法中的类的任何实例访问。 它们只能访问一个特定的类的实例。
它们不需要初始化,未初始化的实例变量的值是:nil 。
示例:
class States
def initialize(name)
@states_name=name
end
def display()
puts "States name #@states_name"
end
end
# Create Objects
first=States.new("Hainan")
second=States.new("GuangDong")
third=States.new("Beijing")
fourth=States.new("ShangDong")
# Call Methods
first.display()
second.display()
third.display()
fourth.display()
执行上面代码,输出结果如下:
States name Hainan
States name GuangDong
States name Beijing
States name ShangDong
4. 全局变量
全局变量名以$号开头。在全局范围内可访问,可以从程序中的任何位置访问它。
未初始化的全局变量的值会被初始化为:nil。建议不要使用全局变量,因为它们使程序变得秘密和复杂。
Ruby中有一些预定义的全局变量。
示例:
创建一个Ruby文件:global-variables.rb,编写以下代码 -
$global_var = "GLOBAL"
class One
def display
puts "Global variable in One is #$global_var"
end
end
class Two
def display
puts "Global variable in Two is #$global_var"
end
end
oneobj = One.new
oneobj.display
twoobj = Two.new
twoobj.display
执行上面代码,输出结果如下:
Global variable in One is GLOBAL
Global variable in Two is GLOBAL
总结
以下是上面几种类型变量的概括 -
| 特性 | 局部变量 | 全局变量 | 实例变量 | 类变量 |
|---|---|---|---|---|
| 范围 | 仅限于初始化块内 | 全局范围 | 属于一个类的一个实例 | 仅限于创建它们的整个类 |
| 命名约定 | 以小写字母或下划线(_)开头 |
以$符号开头 |
以@符号开头 |
以@@符号开头 |
| 初始化 | 不需要初始化,未初始化的局部变量被解释为没有参数的方法 | 不需要初始化,未初始化的全局变量的值为:nil。 |
不需要初始化,未初始化的实例变量的值为:nil。 |
需要在使用前进行初始化,未初始化的全局变量会导致错误。 |
数据类型
1. 数字
整数和浮点数位于数字类别中。
整数以二进制格式保存。 整数是没有分数的数字。 根据它们的大小,有两种类型的整数。 一个是Bignum,另一个是Fixnum。
| 类别 | 描述 | 示例 |
|---|---|---|
| Fixnum | 正常数字 | 1 |
| Bignum | 大数字 | 9999999910129 |
| Float | 十进制浮点数 | 3.0 |
| Complex | 复数/虚数 | 4 + 3i |
| Rational | 有理数 | 9/4 |
| BigDecimal | 有精度十进制数 | 6.0 |
示例:
- 在使用整数的计算中,则只会返回整数。
C:\Users\Administrator>irb
irb(main):001:0> 3 + 6
=> 9
irb(main):002:0>
- 在使用
float类型的计算中,只会将float类型数值返回。
irb(main):003:0> 4.4 + 5.6
=> 10.0
irb(main):004:0> 5 + 7.9
=> 12.9
irb(main):005:0>
- 在执行除法运算的情况下,将显示以下输出。
irb(main):002:0> 17/3
=> 5
irb(main):003:0>
2. 字符串
字符串是表示一个或多个单词的一组字母。 字符串通过在单(')或双(")引号内包含文本来定义。
示例:
- 两个字符串之间可以使用
+号进行连接。
irb(main):005:0> "Yii" + "Bai" + ".com"
=> "YiiBai.com"
irb(main):006:0> 'Yii' + 'Bai' + '.com'
=> "YiiBai.com"
irb(main):007:0> 'Yiibai' + ".com"
=> "Yiibai.com"
irb(main):008:0>
- 将数字字符串与数字相乘将重复该字符串多次。
irb(main):008:0> "1" + "2" + "3"
=> "123"
irb(main):009:0> "yiibai" * 3
=> "yiibaiyiibaiyiibai"
irb(main):010:0> 'yii@ ' * 3
=> "yii@ yii@ yii@ "
irb(main):011:0>
Shell
3. 符号
符号就像字符串。一个符号之前是冒号(:)。 例如,
:abcd
它们不包含空格。 含有多个单词的符号用(_)写成。 字符串和符号之间的一个区别是,如果文本是一个数据,那么它是一个字符串,但如果它是一个代码,它是一个符号。
符号是唯一的标识符,表示静态值,而字符串表示更改的值。
示例:
irb(main):011:0> "string".object_id
=> 26922000
irb(main):012:0> "string".object_id
=> 29115220
irb(main):013:0> :symbol.object_id
=> 788188
irb(main):014:0> :symbol.object_id
=> 788188
irb(main):015:0>
在上面的演示代码中,为字符串创建了两个不同的object_id,但是对于符号,创建了object_id。
4. 哈希
哈希将其值分配给其键。 它们可以用键关联指定值。键的值由=>符号分配。 键/值对之间用逗号分隔,所有对都用大括号括起来。 例如,
{"key1" => "value1", "key2" => "Chemistry", "key3" => "Maths"}
实例
#!/usr/bin/ruby
data = {"key1" => "Physics", "key2" => "Chemistry", "key3" => "Maths"}
puts data["key1"]
puts data["key2"]
puts data["key3"]
执行上面代码,得到以下结果 -
Physics
Chemistry
Maths
5. 数组
数组存储数据或数据列表。 它可以包含所有类型的数据。 数组中的数据之间用逗号分隔,并用方括号括起来。 例如,
["Akash", "Ankit", "Aman"]
数组中的元素由其位置检索。 数组中元素的位置以0开头。
示例:
data = ["Akash", "Ankit", "Aman"]
puts data[0]
puts data[1]
puts data[2]
执行上面代码,得到以下结果
Akash
Ankit
Aman
if-else语句
1. Ruby if语句
Ruby if语句测试条件。 如果condition为true,则执行if语句。
语法:
if (condition)
//code to be executed
end
流程示意图如下所示 -

代码示例:
a = gets.chomp.to_i
if a >= 18
puts "You are eligible to vote."
end
执行上面代码,得到以下结果 -
90
You are eligible to vote.
2. Ruby if else语句
Ruby if else语句测试条件。 如果condition为true,则执行if语句,否则执行block语句。
语法:
if(condition)
//code if condition is true
else
//code if condition is false
end
流程示意图如下所示 -

代码示例:
a = gets.chomp.to_i
if a >= 18
puts "You are eligible to vote."
else
puts "You are not eligible to vote."
end
执行上面代码,得到以下结果 -
80
You are eligible to vote.
15
You are not eligible to vote.
3. Ruby if else if(elsif)
Ruby if else if 语句测试条件。 如果condition为true则执行if语句,否则执行block语句。
语法:
if(condition1)
//code to be executed if condition1is true
elsif (condition2)
//code to be executed if condition2 is true
else (condition3)
//code to be executed if condition3 is true
end
流程示意图如下所示 -

示例代码 -
a = gets.chomp.to_i
if a <50
puts "Student is fail"
elsif a >= 50 && a <= 60
puts "Student gets D grade"
elsif a >= 70 && a <= 80
puts "Student gets B grade"
elsif a >= 80 && a <= 90
puts "Student gets A grade"
elsif a >= 90 && a <= 100
puts "Student gets A+ grade"
end
将上面代码保存到文件:if-else-if-statement.rb中,执行上面代码,得到以下结果 -
25
Student is fail
80
Student gets B grade
4. Ruby三元语句
在Ruby三元语句中,if语句缩短。首先,它计算一个表达式的true或false值,然后执行一个语句。
语法:
test-expression ? if-true-expression : if-false-expression
示例代码
var = gets.chomp.to_i;
a = (var > 3 ? true : false);
puts a
执行上面代码,得到以下结果 -
Ternary operator
5
2
case语句
在Ruby中,使用’case‘代替’switch‘关键字,以及使用’when‘代替’case‘关键字。 case语句将一个语句与多个条件进行匹配,就像其他语言中的switch语句一样。
语法:
case expression
[when expression [, expression ...] [then]
code ]...
[else
code ]
end
代码示例:
print "Enter your day: "
day = gets.chomp
case day
when "2"
puts '穿红色和白色?'
when "3"
puts 'Wear Green'
when "4"
puts 'Wear Yellow'
when "5"
puts 'Wear White'
when "6"
puts 'Wear Black'
else
puts "Wear Any color"
end
执行上面代码,得到以下结果 -
Enter your day: 3
Wear Any color
Enter your day: 2
穿红色和白色?
Enter your day: 3
Wear Green
Enter your day: 5
Wear White
for循环
语法:
for variable [, variable ...] in expression [do]
code
end
1. Ruby使用for循环遍历范围
代码示例:
puts "输入一个数字:"
a = gets.chomp.to_i
for i in 1..a do
puts i
end
执行上面代码,得到以下结果 -
输入一个数字:
8
1
2
3
4
5
6
7
8
2. Ruby使用for循环遍历数组
代码示例:
x = ["Blue", "Red", "Green", "Yellow", "White", '五颜六色']
for i in x do
puts i
end
将上面代码保存到文件:for-loop-arrays.rb中,执行上面代码,得到以下结果 -
Blue
Red
Green
Yellow
White
五颜六色
while/do...while循环语句
语法:
while conditional [do]
code
end
Ruby
while循环流程示意图如下 -

代码示例:
#!/usr/bin/ruby
puts "Enter a value:"
x = gets.chomp.to_i
while x >= 0
puts x
x -=1
end
Ruby
将上面代码保存到文件: while-loop.rb 中,执行上面代码,得到以下结果 -
F:\worksp\ruby>ruby while-loop.rb
Enter a value:
8
8
7
6
5
4
3
2
1
0
F:\worksp\ruby>
Shell
Ruby do…while循环
Ruby do...while循环遍历程序的一部分几次。 它与while循环语法非常相似,唯一的区别是do...while循环将至少执行一次。 这是因为在while循环中,条件写在代码的末尾。
语法:
loop do
#code to be executed
break if booleanExpression
end
代码示例:
loop do
puts "Checking for answer: "
answer = gets.chomp
if answer == '5'
puts "yes, I quit!"
break
end
end
执行上面代码,得到以下结果 -
Checking for answer:
1
Checking for answer:
2
Checking for answer:
3
Checking for answer:
4
Checking for answer:
5
yes, I quit!
until循环语句
Ruby until循环运行直到给定的条件求值为true。 当条件成立时,它退出循环。 它正好与while循环相反,while循环运行直到给定的条件评估求值为false。
until循环允许您编写更可读和逻辑的代码。
语法:
until conditional
code
end
代码示例:
i = 1
until i == 10
print i*10, "\n"
i += 1
end
执行上面代码,得到以下结果 -
10
20
30
40
50
60
70
80
90
break/next语句
Ruby break语句用于终止循环。 它主要用于在while循环中,在条件为真时执行语句,break语句一般用于终止循环。
break语句一般是在循环中调用的。
语法:
break
Ruby
代码示例:
#!/usr/bin/ruby
i = 1
while true
if i*5 >= 25
break
end
puts i*5
i += 1
end
Ruby
将上面代码保存到文件: break-statment.rb 中,执行上面代码,得到以下结果 -
F:\worksp\ruby>ruby break-statment.rb
5
10
15
20
F:\worksp\ruby>
Shell
Ruby next语句
Ruby next语句用于跳过循环的下一个迭代。 执行下一条语句后,不再执行进一步的迭代。
Ruby中的下一条语句等同于其他语言的continue语句。
语法:
next
示例代码:
for i in 1...12
if (i % 3 ==0) then
puts "Skip over ... "
next
end
puts i
end
执行上面代码,当i除以3等于0时,就会跳过后面的打印语句,得到以下结果 -
1
2
Skip over ...
4
5
Skip over ...
7
8
Skip over ...
10
11
redo/retry语句
redo/retry语句
Ruby redo语句用于重复循环的当前迭代。 redo语句在没有访问循环的条件的情况下进行。
redo语句在一个循环中使用。
语法:
redo
Ruby
代码示例:
#!/usr/bin/ruby
array=[1,2,3,4,5]
array.each do |i|
puts i
i+=1
redo if i==3
end#输出:1 2 3 3 4 5
Ruby
将上面代码保存到文件: redo-statment.rb 中,执行上面代码,得到以下结果 -
F:\worksp\ruby>ruby redo-statment.rb
1
2
3
3
4
5
F:\worksp\ruby>
Shell
Ruby retry语句
Ruby retry语句用于从一开始重复整个循环迭代。
retry语句在循环中使用。
语法:
retry
示例代码
n = 0
begin
puts 'Trying to do something?'
raise 'oops'
rescue => ex
puts ex
n += 1
retry if n < 3
end
puts "Ok, I give up"
执行上面代码,得到以下结果 -
Trying to do something?
oops
Trying to do something?
oops
Trying to do something?
oops
Ok, I give up
注释
Ruby注释是程序中不可执行的行。这些行会被解释器忽略,因此它们在执行程序时不执行。注释由程序员编写,以解释他们的代码,以便其他看代码的人会更好地理解这此编写的代码。
Ruby的注释类型 -
- 单行注释
- 多行注释
1. Ruby单行注释
Ruby单行注释用于一次只注释一行。它们以#字符开头。
语法:
#This is single line comment.
代码示例:
#!/usr/bin/ruby
i = 10 #Here i is a variable.
# 这是另外一行注释..
puts i
将上面代码保存到文件: oneline-comment.rb 中,执行上面代码,得到以下结果 -
10
2. Ruby多行注释
Ruby多行注释用于一次注释多行。 它们使用=begin开始并在行尾以=end为终点。
=begin
This
is
multi line
comment
line 1
another line...
=end
代码示例:
=begin
we are declaring
a variable i
in this program
=end
i = 10
puts i
将上面代码保存到文件: muline-comment.rb 中,执行上面代码,得到以下结果 -
10


