Ruby學習筆記


Ruby語言中,以對象為基本單位,可以說所有的元素都是對象。按照之前對於面向對象程序的理解,對象是指包含了特定屬性和方法集合的一組程序。對象由類來定義,具體的表現為對象實例。也就是說,對象是類的實例化[2]。

Ruby語言的基礎元素

對象:數值對象、字符串對象、正則表達式對象、時間對象、文件對象、目錄對象、數組、哈希、例外對象等

數值對象


     由於Ruby中一切數據都是對象,所以我們處理的數字實際上也是對象。

     a = 10,這樣一個簡單的賦值語句,實際上應當理解為 a = Numeric.new(10) 這樣的一種實例化形式。

變量:局部變量(小寫字母或_開頭)、全局變量($)、實例變量(@)、類變量(@@)、虛擬變量。

     Ruby中的變量在聲明時,也不需要指定類型,這有點類似於弱類型語言的PHP。但是在變量被使用時,他的類型就會被確定。

常量:以大寫字母開頭的變量就是常量

Ruby 中的保留字

Image(9)

Ruby中一般以換行來做為語句分割,也可以使用;來作為語義的分割符。在程序的書寫過程中,我們要注意保持良好的書寫風格。

運算符

操作運算符

     +、-、*、/、%、**

比較運算符

     >=、<=、==、<>、===

     == 運算符只能進行兩個對象值的比較,如果要對對象進行比較,則需要使用特定的方法 obj1.eql?(obj2),obj1.equal?(obj2)

     對於數值對象,比較方法做了自定義,所以結果會有些不同。

     Ruby中,對於返回True或False這種方法,命名上一般以?結尾,例如 def AreUSure?()。

邏輯運算符

     &&、||、and、or

位運算符

     &、|、~、^、>>、<<

Ruby中的真值與假值

Ruby中,在進行判斷時,false 和 nil 都為假,除此以外的所有值為真。nil 是一個特殊值,用於在正則表達式中表示沒有找到匹配的內容。也就是說,0 在ruby中也是真值。

Ruby中的Symbol

在Ruby中Symbol表示“名字”,比如字符串的名字、標識符的名字,創建一個Symbol對象的方法是在名字或者字符串之前加上":"。Ruby中每一個對象都有唯一的對象標識符(Object Identifier),可以用object_id方法(Getter)獲得。

Ruby中的Block

代碼塊 Code Block 是Ruby的一個很強大的功能,同時又不是很容易理解其設計原理的一個元素。在《Programing Ruby》這本書中指出,block的存在可以用來實現Ruby中的一些Iterator,例如:

Array.each { |index|  print Array[index] }

Block的定義方式有兩種,一種是{},另外一種是do/end。前一種比較適合編寫單行程序時使用,后一種比較適合多行程序的情況。具體例子如下:

def greet(name)
    print "Hello #{name} "
    yield
end
greet("Wang") do
    print "Hi"
end

Blcok必須跟在方法調用的后面,通過方法中的yield出發Block的執行。

控制語句

條件判斷語句

     在condition為真值時,執行對應區塊的內容。

     if  condition then

          block 1

     else

          block 2

     end

還可以有多個分支

     if condition then

          block 1

     elsif condition then

          block 2

     else

          block 3

     end

Ruby中提供了一個與if相反的條件判斷語句 unless

     unless condition then

          block 1

     else

          block 2

     end

分支判斷語句

     case condition

     when value1 then

          block 1

     when value2 then

          block 2

     else

          block 3

     end

     值得一提的是,case語句中的判斷不僅僅只是變量數值的判斷,也可以使對象類型的判斷,也可以使正則表達式的判斷,所以Ruby的Case語句使用起來,功能可以非常的強大。

循環控制語句

     循環控制語句用在我們希望重復執行一些動作時,使用循環控制語句,需要注意兩個要點:一個是循環的條件、一個是循環的次數。

     Ruby中提供了for、while、until三個循環控制語句,each、times、loop三個循環控制方法,我們可以根據需要選擇不同的方式。

     while condition do

          block 1

     end

     for variable in object do

          block

     end

     until condition do

          block

     end

     object.each{|variable|

          block

     }

     Number.times { | index variable |

          block

     }

     loop {

          block

     }

     Ruby同時提供了三個循環控制的語句,包括:break、next、redo。

Ruby中的類、方法與模塊

Ruby中的類

     類是對對象行為和屬性的描述。做為一門面向對象的腳本語言,Ruby中支持類的概念,支持類的定義、繼承(不允許繼承多個父類)、限定方法的訪問范圍、Setter和Getter的設置等。

     類的定義

     class ClassName

          Version = "1.0"

          attr_accessor     :name

          def initialize(parameter)

          end

          public

          def publicMethod1

               block

          end

          def publicMethod2

               block

          end

          private

          def privateMethod1

               block

          end

          def privateMethod2

               block

          end

     end

     類的訪問限定符

     Ruby中提供了 public、private、protected 三個方法訪問限定符,可以對單個或批量的方法制定訪問的限制條件。可以單獨對單個方法進行訪問限定,也可以使用批量的方式對多個方法使用訪問限定。

     默認情況下,所有的方法都是 public ,除了 initialize 之外,它始終是一個 private 的方法。

     類的繼承

     class People

     end

     class Male < People

     end

Ruby中的模塊

     命名空間的概念?

     模塊的定義

     module moduleName

     end

     在其他文件中使用模塊時,首先需要使用require將模塊文件包含進來,AutoLoad?。模塊可以在類中引入,這樣模塊的方法就會成為類的方法。可以使用這個小技巧來實現Ruby的多重繼承。

Ruby中的方法(函數)

     Ruby中的方法區分為實例的方法、類的方法、函數性方法。其區分的依據為方法接收者的不同。

     實例方法的使用方式,實例方法的定義實際上是在類中完成的。

     object.method( argument1, argument2, argument3 )

     類方法的使用方式

     f = File.open( filename )

     函數性方法的定義

     def functionName( parameter1, parameter2 = "default value")

          block

          return

     end

     函數性方法可以省略 return 語句,這時函數的返回值就是方法中最后一個語句的值,就像 Perl 的處理一樣。省略 Return 語句可以為代碼書寫帶來一些方便,但我們需要謹慎對待。

     Ruby的函數可以返回多個值,例如:

     a, b, c = funca()

錯誤與例外處理

編寫任何程序都可能會發生錯誤,包括語法錯誤、邏輯錯誤。也可能會發生一些意外,比如說硬件的意外損壞。所以我們在編寫程序時,要多所有可能發生的意外情況進行考慮。在沒有例外處理的語言中,我們需要對每種可能發生錯誤的情況進行判斷。幸好,Ruby中提供了例外處理機制,它使我們的工作量大大的減輕了。

錯誤處理的一般形式

     begine

          block

     rescue=> ex

          print ex.message

          block

     ensure

          block

          retry

     end

     Ruby中提供了 resuce 來在遇到例外時進行錯誤處理,ensure 確保不管在什么情況下它下面的代碼部分都會執行,retry 重新嘗試從 begin 開始的代碼。默認情況下 $! 返回例外對象,$@ 返回例外信息。

     Ruby 提供了 catch throw 的語法,但是這個和其他語言貌似區別很大。

     Ruby提供了一個標准的例外類,其下有眾多的子類來表示不同的例外情況。

Ruby中常用的類

Numeric 類

Numeric類下包括了Integer、Fixnum、Bignum、Float四個子類,關系如下圖所示。

Image(10)

為了方便數學運算,Ruby提供了Math模塊,可以方便的進行三角函數等方面的公式運算。

Array類

數組在任何語言中都是非常重要的一個元素,數組提供了一個數據的容器,讓我們可以通過索引快速的遍歷和訪問需要的數據元素。

Ruby中的數組可以扮演三種角色:普通的索引數組、集合、隊列。借由這三種不同的使用方式,我們可以利用數組來實現FIFO、LILO等多種數據結構。

數組的創建有多種方式:

1、使用 []。

2、使用 Array.new

3、類似於Perl的數組創建方式,使用%w進行創建。

4、使用 obj.to_a 方法,將對象轉換為數組。

5、使用split方法,將字符串分割為數組。

Array類中提供了大量的函數方便進行數組的操作,包括:arr.at(index)、arr.pop()、arr.push(value)、arr.shift()、arr.unshift(value)、arr.last()、arr.first()、arr.next()、

、arr.slice()、arr.values_at()、arr.concat()、a.compact()、a.compact!()、a.delete()、a.delete_at()、a.delete_if{|item| ... }、a.reject(|item|)、a.reject!(|item|)、a.slice!()、a.uniq()、a.uniq!()、a.collect{|item| ... }、a.collect!{|item| ... }、a.map{|item| ... }、a.map!{|item| ... }、a.fill()、a.fill(value,begin)、a.fill(value,begin,len)、a.fill(value, n..m)、a.flattern()、a.flattern!()、a.reverse()、a.reverse!()、a.sort()、a.sort!()、a.sort{|i,j| ... }、a.sort!{|i,j| ... }、a.sort_by(|i| ...)、等。

對於數組的遍歷,我們可以采用循環配合索引的方式,也可以采用Array提供的一些函數來實現。Array提供的函數中,有一類不會改變數組本身的內容,這種方法稱為非破壞性方法,有一些方法會使數組的內容發生改變,這類方法稱為破壞性方法。對於兩種方式都提供的函數,一般在破壞性方法后加上!來進行區分。我們在使用時,應當特別注意。

String類

字符串,是程序開發中非常常見的一種數據類型。Ruby中,新建字符串的方式有:

     1、直接使用"或者'新建

     2、String.new新建

     3、使用%Q和%q的方式新建

因為都是繼承自Object類,所以和Array一樣,有一些公共的方法可以調用,比如is_a、delete、size、slice等方法(真的么?有點懷疑)。

字符串中,應當注意內嵌表達式,例如 "a string is #{value}",和 內嵌文檔 Here Document。這兩個方法,在PHP等腳本語言中也非常常見,能夠為處理變量和多行的文本輸出帶來很大的方便。

另外一個需要關心的問題,就是字符串的編碼問題。對於西歐文字,如果使用ASCII編碼,那么我們就可以認為字符串的長度,就等於存儲字符串的字節的長度。但是在處理中文或其他類似文字時,往往不能夠使用一個字節來存儲文字,所以字符串的長度會同字節的長度有不一致。

在程序開發中,字符串處理常見的操作包括:去掉前后的空格(chomp)、去掉行尾的換行(strip)、查找字符串、替換字符串(sub、gsub、tr、正則等)、截取字符串(索引方式、函數方式)、計算字符串的長度等。

Hash類

Hash做為一種數據結構,具有較快的存取速度,在處理一些Key-Value的場景中發揮重大的作用。

Ruby中的hash對象,創建方式包括:{}、Hash.new兩種。Hash的key理論上可以是任何對象,但是實際當中,我們一般選擇Numberic、String、Date等做為key值,因為這樣的key值在比較中更為准確,而其他的對象是否一致的比較則相對復雜。

Ruby中提供了獲取key、value的批量及迭代方式,方便我們獲取對象中的內容。

正則表達式類(Regexp)

正則表達式的歷史可以追溯到科學家對人類神經系統工作原理的早期研究。美國新澤西州的Warren McCulloch和出生在美國底特律的Walter Pitts這兩位神經生理方面的科學家,研究出了一種用數學方式來描述神經網絡的新方法,他們創新地將神經系統中的神經元描述成了小而簡單的自動控制元,從而作出了一項偉大的工作革新。

The origins of regular expressions lie in automata theory and formal language theory, both of which are part of theoretical computer science. These fields study models of computation (automata) and ways to describe and classify formal languages. In the 1950s, mathematician Stephen Cole Kleene described these models using his mathematical notation called regular sets.[1] The SNOBOL language was an early implementation of pattern matching, but not identical to regular expressions. Ken Thompson built Kleene's notation into the editor QED as a means to match patterns in text files. He later added this capability to the Unix editor ed, which eventually led to the popular search tool grep's use of regular expressions ("grep" is a word derived from the command for regular expression searching in the ed editor: g/re/p where re stands for regular expression[2]). Since that time, many variations of Thompson's original adaptation of regular expressions have been widely used in Unix and Unix-like utilities including expr, AWK, Emacs, vi, and lex.

正則表達式是為了進行較為復雜的字符串匹配而出現的。

Ruby中,創建正則表達式對象有幾種方法://、Regexp.new()、%r等。

Ruby中正則表達式的元字符與其他語言中的正則表達式保持一致。

String類提供了sub、gsub、scan三個方法可以接收正則表達式對象。

IO類

IO是每個程序語言必不可少的部分,通常IO有三個,標准輸入、標准輸出、錯誤輸出。

對於Console來說,Ruby中使用$stdin、$stdout、$stderr來表示。

文件IO是我們平時編程中最常用到的一種。Ruby和其他語言一樣,提供了open、close、seek、popen、gets、readline、read等函數來幫助我們完成文件的讀取、修改、保存操作。

File和Dir類

IO類為我們提供了操作輸入、輸出的標准方法,但是對於我們平時經常遇到的文件系統來說,對於文件和目錄的操作是我們經常要進行的,所以Ruby提供了File和Dir類,同時還提供了FileTest、fileutils等輔助類,來幫助我們更方便的進行程序的編寫。

Time、Date、DateTime類

如果不熟悉的人,看到這三個類,一定會問為什么要這么多關於時間處理的類?

Ruby中的進程與線程

Fiber、Thread、Process。

Fibers提供了掛起程序的一部分,然后執行另外一部分程序的能力。實際上Fiber並不是完整意義上的多線程,因為程序的執行會產生中斷,仍然是單條線索在執行。基本形式如下:

fiber = Fiber.new do

     Fiber.yield 1

     2

end

puts fiber.resume

Firber創建后,並不自動運行,而是等到Fiber#resume方法調用后,開始執行block內的語句。遇到Fiber.yield后,暫停程序的執行,直到下一次調用Fiber#resume或者程序執行結束。

Thread。

在1.9之前,Ruby的多線程由解釋器實現,在1.9之后,多線程開始由系統來實現。但是由此帶來了一個問題,很多Ruby的擴展並不是Thread Safe的,所以有時候會遇到問題,這個需要比較注意。Thread的創建方法。

threads = []

10.times{

     threads << Thread.new(parameter) do |p|

     end

}

threads.each{ |thr| thr.join  }

Ruby中的工具

ri 文檔查看利器。通過 ri options names 的方式,可以查看ruby的文檔,真是非常方便啊!

irb 使用irb進行交互式的編程。

參考資料:

1、Ruby Programming 高橋征義   

2、百度百科-對象的定義

3、百度百科-Ruby on rails

4、Ruby Doc

5、百度百科-正則表達式

6、Stephen Cole Kleene

7、Programming Ruby by Dave Thomas

8、Ruby中的Symbol

9、Ruby之Symbol研究


免責聲明!

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



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