1. Ruby執行選項
符號 | 作用 |
---|---|
-c | 檢查代碼正確性 |
-w | 警告模式運行 |
-e | 字面腳本 |
-l | 行模式運行 |
單獨
ruby -c Hello.rb
組合
ruby -le 'print "Hello";print "Ruby"'
2. 常量,變量
2.1 常量
通常以首字母大寫或全部大寫為常量。
CON1=1000
puts "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-1
puts "i="+i.to_s+"類型是"+i.class.to_s #.class可以得到該數值的類型
puts "k="+k.to_s+"類型是"+k.class.to_s
f=3.1415
puts "f="+f.to_s+"類型是"+f.class.to_s
i=1073741824類型是Bignum
k=1073741823類型是Fixnum
f=3.1415類型是Float
3.2 范圍
用===
來判斷右邊對象是否在左邊對象里面
#..與...的區別
a=1..5
b=1...5
print "a的元素是"
a.each do|i|
print i.to_s
end
puts "\n",a===5
print "b的元素是"
b.each do|i|
print i.to_s
end
puts "\n",b===5
a的元素是12345
true
b的元素是1234
false
常用方法:
方法 | 說明 |
---|---|
to_a |
轉換成一個數組 |
include?() 或者 === |
是否包含 |
min() begin() firsst() |
最小值 |
max() end() last() |
最大值 |
常用迭代器
迭代器 | 說明 |
---|---|
regect |
轉為數組,刪除滿足條件元素 |
select |
轉為數組,選擇滿足條件元素 |
each |
輸出迭代范圍中每個元素 |
其中each最為常用,演示如下
a=1..10
a.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
代碼塊1
else
代碼塊2
end
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
代碼塊1
end
迭代器
Array.each do|定義的變量名|
代碼塊
end
5.4 跳轉
break
next
return
6. 數據處理
6.1 字符串
雙引號的字符串,與單引號的字符串
strd="good\nmorning"
strs='good\n morning'
puts strd
puts 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+b
puts c
我的名字是Philippian
用<<
合並
a="我的名字是"
b="Philippian"
a<<b
puts a
我的名字是Philippian
替換 復制 改變
替換replace
方法
str="hehe"
puts "替換前是"+str
str.replace("呵呵噠")
puts "替換后是"+str
替換前是hehe
替換后是呵呵噠
復制 dup
clone
方法
dup
只復制內容,clone
復制其特殊方法,taint,freeze等信息
str="Philippian"
puts str.dup
puts 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_s
puts "從第5個字符開始往后的三個字符"+str[4,3]
第二個字符為h
二到六字符為hilip
第二個字符的ASCII值是104
從第5個字符開始往后的三個字符ipp
比較
a=String.new
a="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.new
student["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 數組
兩種方式創建數組:
1
stu_name=["小明","小強","小剛","小紅","小芳"]
2
stu_name=Array.new
stu_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_name1
puts "------"
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創建的對象
end
end
stu1=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
end
end
class Student
def sayAge age
puts "my age is "+age.to_s
end
end
Phi=Student.new
Phi.sayAge 18
Phi.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
end
end
he=Student.new
he.sayName "Philippian"
math=Student::Homework.new
math.doHomework
My name is Philippian
I did my Homework
7.1.3 特殊類
專門為某個對象添加的類
class Student
def sayName name
puts "My name is "+name
end
end
he=Student.new
he.sayName "Philippian"
class << he #特殊類
def singSong song_name
puts "I sang a song, its name is "+song_name
end
end
he.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
end
end
he=Student.new
he.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
end
end
xiaoming=Xiaoming.new
puts xiaoming.sayName
puts xiaoming.sayAge.to_s
Xiaoming
19
7.2.3 特殊方法
class Student
def sayName name
puts "My name is "+name
end
end
he=Student.new
he.sayName "Philippian"
def he.sayAge age #特殊方法
puts "My age is "+age.to_s
end
he.sayAge 18
Xiaoming
19
7.2.4 類方法
class Student
def Student.sayClass
puts self.class
end
end
Student.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}"
end
end
he=Student.new "Philippian",19
he.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
end
end
he=Student.new
he.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"
end
end
class Dog<Animal #繼承
def run #Dog類自己的方法
puts "I am a dog, I can run"
end
def eat #重寫父類的方法
puts "I am a dog, I like eating bone"
end
end
wangwang=Dog.new
wangwang.eat
wangwang.breathe
wangwang.run
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"
end
end
class UniversityStudent<Student
def initialize stu_num
@stu_num=stu_num
super("Philippian", 18) #super關鍵字訪問父類構造方法
end
def show
puts "My name is #{@name}, my age is#{@age}, \nmy student numbe is #{@stu_num}"
end
end
he=UniversityStudent.new 1111111111
he.saySomething
he.show
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"
end
end
‘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"
end
saySomething do
puts "This is in a block"
end
saySomething{
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
此外,代碼塊還可以有參數、返回值等。