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 會遵循下面三個步驟。
- 把每個方法體編譯成獨立的 YARV 指令片段(這種情況發生在 Ruby 解析和編譯程序的時候)。
- 使用當前的詞法作用域來獲取類或模塊的指針(這種情況發生在 Ruby 執行程序的時候遇到了 def 關鍵字)。
- 在該類的方法中保存新的方法名——實際上市保存對應方法名的整數 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 使用了被稱爲單類的隱藏類來實現這種行爲,這就好比是單個對象的元類。區別如下:
- 單類是 Ruby 內部創建的特殊隱藏類,用於容納特定對象獨有的方法。
- 當對象本身就是類的情況下,元類就是單類。
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 | 博文完成 |
Copyright
CSDN:http://blog.csdn.net/y550918116j
GitHub:https://github.com/937447974