繼續上次Ruby的學習。接下來就到了Ruby的方法。數組
Ruby的方法與Python仍然很像。使用def
定義,能夠使用undef
取消定義。
在Ruby中,常常能夠看見方法後面跟有「?」或「!」。這實際上是方法名的一部分。
帶有「?」表示返回一個布爾值;帶有「!」表示方法會修改對象自身。
以Array類爲例:函數
empty?
返回數組是否爲空。至關於isEmpty
。sort!
表示會對數組原地排序。sort
則返回一個排好序的副本,自身不會改變。Ruby的方法能夠無參數,有多個參數,甚至可變數量的參數。學習
對於多個參數,不支持Python式的指定參數,但能夠藉助字典實現。code
method('a'=>1, 'b'=>2)
可變參數與Python相似。對象
def sum(*num) result = 0 num.each {|i| result += i} return result end
由於Ruby中變量不表示類型,並且又支持缺省參數,因此方法不支持重載。可是支持重寫。排序
方法的返回值爲return
表達式的值,或者爲最後一條語句的值。若是return
不帶參數,則返回nil
;若是有多個參數,則返回一個數組。for循環
Ruby還有一個有趣的東西叫作block。雖然有傳統的for循環,但Ruby更經常使用的是each循環,這裏就用到了block。匿名函數
block有這麼幾種使用形式:變量
def method yield end def method(&p) p.call end method { puts "Hello" }
這裏的&p
是什麼?p
表示的是一個Poroc
對象。Proc表示Procedure。&
表示將Proc
對象轉換爲block。Proc
和block的主要區別在於Proc
對象能夠保存,重複使用,而block不能。若是須要再次使用,能夠用Proc.new()
或proc()
將block轉換成Proc
對象。lambda
還有一個與block很類似的lambda表達式。它的樣子像這樣:
lambda {|x| puts x}
長得雖像,但lambda是匿名函數,block是代碼塊。
因此它和block主要有兩個區別: