1. Ruby执行选项
符号 | 作用 |
---|---|
-c | 检查代码正确性 |
-w | 警告模式运行 |
-e | 字面脚本 |
-l | 行模式运行 |
单独
ruby -c Hello.rb
组合
ruby -le 'print "Hello";print "Ruby"'
2. 常量,变量
2.1 常量
通常以首字母大写或全部大写为常量。
CON1=1000puts "I got"+CON1.to_s+"RMByuan"CON1=100 #不报错但是给出警告puts "Now only"+CON1.to_s+"yuan"
2.2 变量
2.2.1 局部变量
在类,模块,方法这些作用域里面有效。下划线_,a-z开头。
2.2.2 全局变量
作用于全局。以$开头
Ruby自带全局变量:全局变量 | 说明 |
---|---|
$0 | Ruby脚本文件名 |
$* | 命令行参数 |
$= | 是否区分大小写 |
$_ | 最近读的字串 |
3. 数据类型
3.1 数值
两种整形Fixnum,Bignum,一种Float型,数据类型也是对象。用.class
来查看当前变量的数据类型。
i=2**30 #基本数据类型也是一个对象k=2**30-1puts "i="+i.to_s+"类型是"+i.class.to_s #.class可以得到该数值的类型puts "k="+k.to_s+"类型是"+k.class.to_sf=3.1415puts "f="+f.to_s+"类型是"+f.class.to_s
i=1073741824类型是Bignum
k=1073741823类型是Fixnum f=3.1415类型是Float
3.2 范围
用===
来判断右边对象是否在左边对象里面
#..与...的区别a=1..5b=1...5print "a的元素是"a.each do|i| print i.to_sendputs "\n",a===5print "b的元素是"b.each do|i| print i.to_sendputs "\n",b===5
a的元素是12345
true b的元素是1234 false
常用方法:
方法 | 说明 |
---|---|
to_a | 转换成一个数组 |
include?() 或者 === | 是否包含 |
min() begin() firsst() | 最小值 |
max() end() last() | 最大值 |
常用迭代器
迭代器 | 说明 |
---|---|
regect | 转为数组,删除满足条件元素 |
select | 转为数组,选择满足条件元素 |
each | 输出迭代范围中每个元素 |
其中each最为常用,演示如下
a=1..10a.each do|i| print i.to_s+" "end
1 2 3 4 5 6 7 8 9 10
3.3 符号
符号对象是 字符串,方法,类,或者标识符的内部表示形式。
用:
或者 %{}
创建符号对象 str1="good morning"sym1=:"good morning"puts str1==sym1 #比较对象puts str1.to_sym==sym1 #字符串转成符号后比较内容puts sym1.to_s==str1 #符号转成字符串后比较内容
false
true true
4. 运算符
- 基本:求余
%
, 乘方**
其他:+,-,*,/
- 赋值运算:
=,+=,-=,#=,/=,%=,**=
- 位运算符:
位运算符 | 说明 | 位运算符 | 说明 |
---|---|---|---|
& | 按位 与 | << | 向左移位 |
>> | 按位 或 | >> | 向右移位 |
~ | 按位非 | ^ | 异或 |
4. 比较运算
运算符 | 说明 | 运算符 | 说明 |
---|---|---|---|
!= | 不等于 | =~ | 正则表达式匹配 |
<=> | 比较两对象结果1,0,-1 | !~ | 正则表达式不匹配 |
5. 逻辑运算
逻辑运算符 | 含义 |
---|---|
&& | 逻辑“且” |
|| | 逻辑“或” |
! | 逻辑“非” |
6. 三目运算符
score<600? "仍需努力":"考上复旦没问题"
5. 语句
5.1 if
if(条件) then 代码块elsif(条件) 代码块else 代码块end
可以省略
if
对应的是elsif
而不是elseif.then
关键字
unless与if相反,unless后面的语句结果是true时执行 第二个代码块,否则执行第一个代码块
unless(条件) then 代码块1else 代码块2end
5.2 case语句
case 表达式 when 常量1,常量2...常量3 then 代码块1 when 常量n.. then 代码块2 else 代码块3
when 后面可以是Range对象。
将表达式的值与常量进行比较需要用===
而不是==
5.3 循环
while循环:
while (条件) do代码块end
until循环:
until (条件) do#条件表达式为false代码块被执行代码块end
for…in语句主要用于 数组 和Hash对象
for 自定义名称 in Array|Hash do 代码块1end
迭代器
Array.each do|定义的变量名| 代码块end
5.4 跳转
break
next
return
6. 数据处理
6.1 字符串
双引号的字符串,与单引号的字符串
strd="good\nmorning"strs='good\n morning'puts strdputs strs
运行结果:
good
morning good\n morning
转义字符与特殊字符
字符串 | 含义 |
---|---|
\a | Bell对应符号 |
\nnn | nnn 是八进制数,替换成字符 |
\b | 退格 |
\xnn | xnn 是十六进制数,替换成字符 |
\e | esc 键的字符 |
\cx | ctrl+X 对应字符,x可以是任意对应字符 |
\C-x | 同上 |
\n | 换行 |
\M-x | Alt+x 对应字符,x可以是任意对应字符 |
\r | 回车 |
\M-\C-x | ctrl+alt+x ,x任意键 |
\s | 空白符 |
\t | Tab 键对应字符 |
\v | 垂直Tab 键对应字符 |
#{} | 替换成变量或者表达式所对应的值 |
6.2 字符串操作
合并
用+
符号合并
a="我的名字是"b="Philippian"c=a+bputs c
我的名字是Philippian
用<<
合并
a="我的名字是"b="Philippian"a<
我的名字是Philippian
替换 复制 改变
替换replace
方法
str="hehe"puts "替换前是"+strstr.replace("呵呵哒")puts "替换后是"+str
替换前是hehe
替换后是呵呵哒
复制 dup
clone
方法
dup
只复制内容,clone
复制其特殊方法,taint,freeze等信息 str="Philippian"puts str.dupputs str.clone
Philippian
Philippian
改变 有多种方法,如下:
方法 | 说明 | 方法 | 说明 |
---|---|---|---|
capitalize | 首字母大写 | Rstrip | 去掉右边空格 |
reverse | 字符反转 | Lstrip | 去掉左边空格 |
chomp | 去掉最后换行符 | upcase | 大写 |
Chop | 山区最后字符 | downcase | 小写 |
swapcase | 大小写转换 |
获取
str="Philippian"puts "第二个字符为"+str[1]puts "二到六字符为"+str[1..5]puts "第二个字符的ASCII值是"+str[1].ord.to_sputs "从第5个字符开始往后的三个字符"+str[4,3]
第二个字符为h
二到六字符为hilip 第二个字符的ASCII值是104 从第5个字符开始往后的三个字符ipp
比较
a=String.newa="good"b=a #a b指向同一内存c="good" #c与ab不同puts a==b #ab内容相同puts a.eql?b #ab内容相同puts a==c #ac内容相同puts a.eql?c #ac内容相同puts a.equal?c #ac不是同一对象puts a.equal?b #ab是同一对象
true
true true true false true
比较大小
使用<=>
符号比较字符串大小,表达式的结果和含义如下: 结果 | 含义 |
---|---|
-1 | 右边字符串大 |
0 | 相同 |
1 | 左边字符串大 |
6.3 Hash
创建Hash对象。形式为 key=>value
student={ "num"=>"11001101110" "name"=>"Philippian" "sex"=>"m" "major"=>"computer science"}
或者:
student=Hash.newstudent["num"]="11001101110"student["name"]="Philippian"
常用方法:
方法 | 说明 |
---|---|
size() length() | Hash对象长度 |
include?(key) has_key?(key) | 是否包含某个key |
delete(key) | 删除指定元素 |
keys() | 得到全部key组成的数组 |
values() | 得到全部value组成的数组 |
迭代器
迭代方法 | 说明 |
---|---|
each | 输出全部元素 key和value |
each_key | 输出所有key |
each_value | 输出所有value |
each_pair | 输出所有key-value对 |
6.4 数组
两种方式创建数组:
1stu_name=["小明","小强","小刚","小红","小芳"]
2
stu_name=Array.newstu_name[0]="小明"stu_name[1]="小强"
取元素:
stu_name=["小明","小强","小刚","小红","小芳"]puts stu_name[-2] #倒数第二个puts stu_name[2] #正数第三个
小红
小刚
增删元素
方法 | 说明 |
---|---|
unshift() | 头部添加数组元素 |
push() | 尾部添加数组元素 |
<< | 尾部添加一个数组元素 |
shift() | 头部删除 |
pop() | 尾部删除 |
组合与截取
stu_name1=["小明","小强","小刚"]stu_name2=["小红","小芳"]stu_name1.concat(stu_name2) #将第二个数组加到第一个里面puts stu_name1puts "------"puts stu_name1[2..4] #截取第三个到第五个
小明
小强 小刚 小红 小芳 —— 小刚 小红 小芳
7. 类,对象,方法
7.1 类
注意:
1. 类的定义 2. 表达式的执行 3. 方法定义 4.self
关键字 5. 创建对象 6. 对象调用方法 class Man #类的名字首字母大写 puts "I am a man" #表达式直接执行 puts self.class #self关键字指自己,此时self为类 def sayName name #定义方法,方法名后面是参数 puts "my name is "+name.to_s puts self.class #self关键字指自己,此时为Man创建的对象 endendstu1=Man.new #创建对象stu1.sayName("Philippian") #调用方法
I am a man
Class my name is Philippian Man
7.1.1 追加类
名字相同的类自动合并
class Student def sayName name puts "my name is "+name endendclass Student def sayAge age puts "my age is "+age.to_s endendPhi=Student.newPhi.sayAge 18Phi.sayName "Philippian"
my age is 18
my name is Philippian
7.1.2 嵌套类
也叫内部类,使用内部类用::
class Student def sayName name puts "My name is "+name end class Homework def doHomework puts "I did my Homework" end endendhe=Student.newhe.sayName "Philippian"math=Student::Homework.newmath.doHomework
My name is Philippian
I did my Homework
7.1.3 特殊类
专门为某个对象添加的类
class Student def sayName name puts "My name is "+name endendhe=Student.newhe.sayName "Philippian"class << he #特殊类 def singSong song_name puts "I sang a song, its name is "+song_name endendhe.singSong "我有一只小毛驴"
My name is Philippian
I sang a song, its name is 我有一只小毛驴
7.2 方法
7.2.1 默认参数
class Student def saySomething sentences="I am a Student" #设置默认参数的值 puts sentences endendhe=Student.newhe.saySomething #没有参数时候he.saySomething "I want to have a holiday!" #有的参数值时候
I am a Student
I want to have a holiday!
7.2.2 返回值
class Xiaoming def sayName "Xiaoming" end def sayAge return 19 endendxiaoming=Xiaoming.newputs xiaoming.sayNameputs xiaoming.sayAge.to_s
Xiaoming
19
7.2.3 特殊方法
class Student def sayName name puts "My name is "+name endendhe=Student.newhe.sayName "Philippian"def he.sayAge age #特殊方法 puts "My age is "+age.to_sendhe.sayAge 18
Xiaoming
19
7.2.4 类方法
class Student def Student.sayClass puts self.class endendStudent.sayClass
Class
7.2.5 构造方法
构造方法名字为initialize
,当调用new方法创建对象的时候,自动调用initialize
初始化
class Student def initialize name,age @name=name @age=age end def show puts "My name is #{ @name}, My age is #{ @age}" endendhe=Student.new "Philippian",19he.show
My name is Philippian, My age is 19
7.3 变量与属性
7.3.1 实例变量
实例变量用于在类内部共享数据。 变量名以@
开头。
- 顶层和顶层方法,
- 类和类方法,
- 模块和模块方法
定义位置 | 作用域 |
---|---|
顶层 | 顶层表达式和顶层函数 |
类、模块 | 当前类,当前模块 |
类方法 | 当前类下所有方法 |
7.3.2 类变量
类变量用于在各个类之间共享数据。允许定义位置与实例变量相同
类变量以@@
开头 7.3.3 属性
属性设置器和读取器
class Student @university def setUniversity=(val) @university=val end def university @university endendhe=Student.newhe.setUniversity="SYSU"puts he.university
SYSU
声明属性的标识符
标识符 | 示例 | 说明 |
---|---|---|
attr | attr:attr1,key | key值false时为只读 |
attr_reader | attr_reader: attr1,attr2 | 一个或多个只读属性 |
attr_writer | attr_writer: attr1,attr2 | 一个或多个 只写属性 |
attr_accessor | attr_accessor: attr1,attr2 | 一个或多个可读写属性 |
7.4 类的继承
class Animal def eat puts "I can eat" end def breathe puts "I can breathe" endendclass Dog
I am a dog, I like eating bone
I can breathe I am a dog, I can run
访问父类构造方法
class Student def initialize (name, age) @name=name @age=age end def saySomething puts "I can say something" endendclass UniversityStudent
I can say something
My name is Philippian, my age is18, my student numbe is 1111111111
7.5 作用域
访问保护 | 名称 | 说明 |
---|---|---|
private | 私有方法 | 方法指定成员只能被类内部访问,对类外部不可见 |
protected | 保护方法 | 可以被隶属的子类访问 |
public | 共有方法 | 没有访问限制 |
两种方法定义访问级别
1. 使用无参数的方法class Animal def eat #默认public puts "I can eat" end public #定义为公有方法 def drink puts "I can drink" end private #定义为私有方法 def breathe puts "I can breathe" end protected #定义为保护方法 def run puts "I can run" endend
‘2. 使用参数指定成员
class Animal def eat puts "I can eat" end def run puts "I can run" end def breathe puts "I can breathe" end private(:eat) #定义为私有方法 protected(:breathe,:run)#定义为保护方法end
7.6 代码块
用{ }
或者 do...end
创建代码块,用yield
传入代码块
def saySomething puts "This is the 1st in method" yield puts "This is the 2nd in method"endsaySomething do puts "This is in a block"endsaySomething{ puts "This is in a block too"}
This is the 1st in method
This is in a block This is the 2nd in method This is the 1st in method This is in a block too This is the 2nd in method
此外,代码块还可以有参数、返回值等。