ruby簡介
Ruby 是一種開源的面向對象程序設計的服務器端腳本語言
- ruby安裝(mac)
$ brew install ruby
$ ruby -v # 查看ruby版本
我們可以在終端中測試ruby
#打開終端,輸入irb
$ irb
> puts(1+2)
3
=> nil
> # 可以在這里做一些簡單的ruby測試,建議還是創建.rb文件,便于代碼保存
Ruby 數據類型
Ruby支持的數據類型包括基本的Number、String、Ranges、Symbols,以及true、false和nil這幾個特殊值,同時還有兩種重要的數據結構——Array和Hash。
- Array: 數組字面量通過[]中以逗號分隔定義,且支持range定義。
(1)數組通過[]索引訪問
(2)通過賦值操作插入、刪除、替換元素
(3)通過+,-號進行合并和刪除元素,且集合做為新集合出現
(4)通過<<號向原數據追加元素
(5)通過*號重復數組元素
(6)通過|和&符號做并集和交集操作(注意順序) - Hash: 哈希是在大括號內放置一系列鍵/值對,鍵和值之間使用逗號和序列 => 分隔。尾部的逗號會被忽略。
- Ranges: 一個范圍表示一個區間,是通過設置一個開始值和一個結束值來表示。范圍可使用 s..e 和 s...e 來構造,或者通過 Range.new 來構造。
使用 .. 構造的范圍從開始值運行到結束值(包含結束值)。使用 ... 構造的范圍從開始值運行到結束值(不包含結束值)。當作為一個迭代器使用時,范圍會返回序列中的每個值。
范圍 (1..5) 意味著它包含值 1, 2, 3, 4, 5,范圍 (1...5) 意味著它包含值 1, 2, 3, 4 。
Ruby判斷真值時
只有 false 和 nil 當做假值。其余一切皆為真(包括 0、 0.0、 "" 和 [])
Ruby 方法
#方法定義
# 1
def func
end
# 2
def func2(var1, var2)
end
# 3. 可變參數
def func3(*args)
end
# 方法調用
func1
func2(v1, v2)
func2 v1, v2
- 方法名有?通常意味著方法返回boolean型結果
- 方法名后有!,則此方法的接收者將被修改
- 方法名后加=,通常意味著賦值
- 如果方法的最后一個參數值有&,Ruby假定這是一個Proc對象,Ruby會把該Proc 對象轉換為一個block,然后在方法中使用。
Ruby 中的==和equals
Ruby 對 == 和 equals() 的處理方式與 Java 不一樣。測試相等性使用 ==(Java 中是 equals())。測試是否為同一對象使用 equals?()(Java 中是 ==)
Ruby 中定義類
# 定義
class Customer
# 實例方法
def getX
@width * @height
end
end
- 一般小寫字母、下劃線開頭:變量(Variable)。
- $開頭:全局變量(Global variable)。
- @開頭:實例變量(Instance variable)。
- @@開頭:類變量(Class variable)類變量被共享在整個繼承鏈中
- 大寫字母開頭:常數(Constant)
new 方法創建對象
對象是類的實例。現在您將學習如何在 Ruby 中創建類的對象。在 Ruby 中可以使用類方法 new 創建對象。
方法 new 是一種獨特的方法,在 Ruby 庫中預定義。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
self
方法前的self在class內部,所以它表示類A,這樣,x方法的調用者是類A自身(而不是它的實例),根據之前的原則,在def關鍵字內部,self表示的是這個方法的調用者,在這里就是類A自己
類的繼承
class Customer < Parent # 使用 <表示繼承關系
end
訪問控制
Ruby 為您提供了三個級別的實例方法保護,分別是 public、private 或 protected。Ruby 不在實例和類變量上應用任何訪問控制。
- Public 方法: Public 方法可被任意對象調用。默認情況下,方法都是 public 的,除了 initialize 方法總是 private 的。
- Private 方法: Private 方法不能從類外部訪問或查看。只有類方法可以訪問私有成員。
- Protected 方法: Protected 方法只能被類及其子類的對象調用。訪問也只能在類及其子類內部進行。
Ruby 模塊(Module)
模塊(Module)是一種把方法、類和常量組合在一起的方式。模塊(Module)為您提供了兩大好處。
- 模塊提供了一個命名空間和避免名字沖突。
- 模塊實現了 mixin 裝置。
模塊(Module)定義了一個命名空間,相當于一個沙盒,在里邊您的方法和常量不會與其他地方的方法常量沖突。
模塊類似與類,但有一下不同:
- 模塊不能實例化
- 模塊沒有子類
- 模塊只能被另一個模塊定義
## 基本結構
module Identifier
statement1
statement2
...........
end
在類中嵌入模塊使用 include 語句:
#demo 定義一個module
module Week
FIRST_DAY = "Sunday"
def Week.weeks_in_month
puts "You have four weeks in a month"
end
def Week.weeks_in_year
puts "You have 52 weeks in a year"
end
end
#在類中引用上面定義的module
class Decade
include Week # 使用include引用module
def no_of_months
puts Week::FIRST_DAY
number=10*12
puts number
end
end
d1=Decade.new # 創建一個對象
puts Week::FIRST_DAY # 調用模塊中的常量
Week.weeks_in_month
Week.weeks_in_year
d1.no_of_months # ok
d1.weeks_in_month # ok
class是使用<作為繼承的關鍵字,只支持單繼承;module是使用include來做實例繼承(實例化的時候動態功能插入),extend做類繼承(可以理解為static繼承)
Class | Module | |
---|---|---|
能否初始化 | 能 | 不能 |
用途 | 定義和新建對象 | namespace,mixin |
父類 | Module | Object |
繼承 | 能繼承與被繼承 | 不能 |
inclusion | 不能 | 可以用 include 在class和module里 |
extension | 不能 | 可以用 extend 在class和module里 |
包含函數 | Class函數和實例函數 | Module函數和實例函數 |
# 使用extends
#在類中引用上面定義的module
class Decade
extend Week # 使用extend引用module
def no_of_months
puts Week::FIRST_DAY
number=10*12
puts number
end
end
## 調用
Decade.weeks_in_month
Decade.weeks_in_year
Ruby 迭代器
迭代(iterate)指的是重復做相同的事,所以迭代器(iterator)就是用來重復多次相同的事。迭代器是集合支持的方法,在 Ruby 中,數組(Array)和哈希(Hash)可以稱之為集合。
collection.each do |variable|
code
end
# demo 遍歷數組
ary = [1,2,3,4,5]
ary.each do |i|
puts i
end
Ruby 塊
您已經知道 Ruby 如何定義方法以及您如何調用方法。類似地,Ruby 有一個塊的概念。
- 塊由大量的代碼組成。
- 您需要給塊取個名稱。
- 塊中的代碼總是包含在大括號 {} 內。
- 塊總是從與其具有相同名稱的函數調用。這意味著如果您的塊名稱為 test,那么您要使用函數 test 來調用這個塊。
- 您可以使用 yield 語句來調用塊。
def test
puts "在 test 方法內"
yield
puts "你又回到了 test 方法內"
yield
end
test {puts "你在塊內"}
關于block,這里不再詳細介紹,下一節將詳細分析Proc、lambda
以上為ruby的部分基本概念,詳細介紹待續。。。