Ruby方法

Ruby 通常用 def 關鍵字定義方法,在 def 之後是新方法的名稱,緊接着是方法體。

1 基礎

1.1 語法

語法如下:

def method_name [( [arg [= default]]...[, * arg [, &expr ]])]
    expr..
end

簡單方法:

def method_name 
    expr..
end

帶參數方法:

def method_name (var1, var2)
    expr..
end

參數帶默認值:

def method_name (var1=value1, var2=value2)
    expr..
end

可變數量的參數:

def method_name (*var)
    for i in 0... var.length
        puts "#{var[i]}"
    end
end

1.2 返回值

ruby 中的 return 語句用於從 ruby 方法中返回一個或多個值。

語法:

return [expr[`,' expr...]]
# 單返回值
return value1
# 多返回值
return value1, value2

Ruby 中的每個方法默認都會返回一個值。這個返回的值是最後一個語句的值。也就是說不寫 return 也會拿到值,如下所示:

def method_name
    "YJ"
end
puts method_name

不過爲了程序更加具有閱讀性,建議寫 return。

2 元編程

使用元編程特性,還能用另外的方式定義方法。

2.1 用 def 關鍵字爲類添加方法

class Quote
    def display
        puts "Ruby's normal method definition process."
    end
end

在程序中使用 def 關鍵字定義新方法,Ruby 會遵循下面三個步驟。

  1. 把每個方法體編譯成獨立的 YARV 指令片段(這種情況發生在 Ruby 解析和編譯程序的時候)。
  2. 使用當前的詞法作用域來獲取類或模塊的指針(這種情況發生在 Ruby 執行程序的時候遇到了 def 關鍵字)。
  3. 在該類的方法中保存新的方法名——實際上市保存對應方法名的整數 ID 值。

2.1 使用 def self 添加類方法

class Quote
    def self.display
        puts "Defining class methods using an object prefix."
    end
end

如果調用 Quote.class,則會返回 Class。所有的類本質上都是 Class 類的實例。元類是內部的概念,通常對 Ruby 程序來說是不可見的。

2.3 使用 class << self 來定義類方法

class Quote
    class << self
        def display
            puts "Defining class methods using a new lexical scope."
        end
    end
end

2.4 爲單個對象實例添加方法

class Quote
end

some_quote = Quote.new
def some_quote.display 
    puts "Defining class methods using Singleton classes."
end

在內部,Ruby 使用了被稱爲單類的隱藏類來實現這種行爲,這就好比是單個對象的元類。區別如下:

  1. 單類是 Ruby 內部創建的特殊隱藏類,用於容納特定對象獨有的方法。
  2. 當對象本身就是類的情況下,元類就是單類。

2.5 使用 class << 增加新的單類方法

class Quote
end

some_quote = Quote.new
class << some_quote
    def display
        puts "Defining methods using Singleton classes in a lexical scope."
    end
end
some_quote.display

 


Appendix

Revision History

時間 描述
2017-07-27 博文完成

CSDN:http://blog.csdn.net/y550918116j

GitHub:https://github.com/937447974

發佈了406 篇原創文章 · 獲贊 28 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章