[Ruby] 方法/函式(function / method)
實例方法
##
# 檢驗 object 中是否包含某一 method
# [object].respond_to?(:[method])
# 也可以不加冒號用引號寫 Obj.respond_to?('[method]')
##
Obj.respond_to?(:next)
Obj.class.respond_to?([method]) # 檢驗某個 obj 的 class 是否包含某 class method
defined? (methods) # 註1
# 檢驗 object 是否為 nil
arr.nil? # [object].nil?
# 檢驗物件類型
:hello.is_a? Symbol # true,[object].is_a? String/Integer/Symbol
:hello.class # Symbol,[object].class
##
# 找出某一物件內的方法來源(註2, 註3)
# 也可以不加冒號用引號寫 Obj.method('methodName')
##
Obj.method(:methodName)
類別方法
[Class].methods # 列出物件內的所有方法
資訊
註 1: In Ruby, how do I check if method “foo=()” is defined? @ StackOverflow 註 2: How to find where a method is defined at runtime? @ StackOverflow 註 3: Find where a method is defined
觀念
implicit return(自動回傳)
在 Ruby 中方法如果沒有寫 return 則會自動回傳方法中最後的表達式。
# method 會自動以 string 的格式 return(implicit return)
def add(a, b)
a+b
end
puts add(3, 5) # 8
命名慣例
在 Ruby 中函式(function)就是方法(method),命名的開頭一般是小寫(也可以是 _ 或數字);結尾可以是?(問號,question)或!(驚嘆號,bang,exclamation)或=(等號,equal)。
一般來說(慣例):
- 結尾如果是
!,執行方式和一般方法沒有差別,但通常用!結尾,表示會有「副作用」,例如,這個方法會改變原本的變數值,同時也表示它會有一個相對應不會改變原本變數值的方法。 - 結尾如果是
?,這個方法經常會回傳表示 true 或 false 的物件。 - 結尾如果是
=,表示這個方法是指派方法(assignment method),在 assignment method 中,函式中的回傳值會被忽略,而是自動回傳參數的值。
# bang, exclamation, 驚嘆號:表示有副作用
a = "Hello everyone"
a.upcase # 沒有驚嘆號,不會改變原本變數的值
puts a # "Hello everyone"
a.upcase! # 有驚嘆號,會改變原本變數的值
puts a # "HELLO EVERYONE"
# question mark,問號:表示回傳 Boolean
a = "Hello everyone"
puts a.nil? # false
puts a.empty? # false
# equal,等號,回傳值會被忽略,直接回傳參數值
def a=
return 3
end
puts a= "Hello", 7
建立方法(method)
建立帶有參數的方法
建立一般的方法
def add(a, b)
puts "#{a} + #{b} is #{a+b}"
end
建立帶有參數預設值的方法
方法內可以定義參數預設值,預設值不一定要放在最前面或最後面,但是必須是組在一起的:
def add_values(a = 2, b)
a + b
end
p add_values 3 # 5
def add_values(a, b = 4)
a + b
end
p add_values 3 # 7