初識Ruby

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的部分基本概念,詳細介紹待續。。。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,115評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,577評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,234評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,621評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,822評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,380評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,128評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,319評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,548評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,048評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,285評論 2 376

推薦閱讀更多精彩內容