1. Ruby基礎知識


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. 運算符

  1. 基本:求余 % , 乘方 ** 其他:+,-,*,/
  2. 賦值運算:=,+=,-=,#=,/=,%=,**=
  3. 位運算符:
位運算符 說明 位運算符 說明
& 按位 與 << 向左移位
>> 按位 或 >> 向右移位
~ 按位非 ^ 異或

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

此外,代碼塊還可以有參數、返回值等。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM