[Rails學習之路]初識Ruby(二)

繼續上次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主要有兩個區別:

  • lambda會檢查參數個數,而block不會。
  • lambda由於是函數,因此調用時是函數調用,返回時回到原函數;而block更像是嵌入了一個代碼塊,若是返回就至關於跳出了原函數。
相關文章
相關標籤/搜索