前一篇介紹了方法以及實體方法與類別方法的不同,方法這個東西在Ruby當中非常常用,也很適合再來討論一下,於是繼續挑了一題有關方法的面試題。
What happens when you call a method in Ruby?
當你在Ruby中呼叫方法的時候發生了什麼事?
class Human
def say_hello
puts "hello"
end
end
John = Human.new
John.say_hello #=> hello
上面的例子在Human
類別定義了一個say_hello
的實體方法,所以John
這個從Human
類別所生出來的實體,就可以使用say_hello
方法,而印出hello。
而實際上在Ruby中某物件呼叫方法的時候,則像是對這個物件傳送一個訊息,而訊息的內容則是這個方法的名字以及這方法的參數(可以是沒有參數)。以上述例子為例,John
呼叫say_hello
方法就像是對John
傳送一個訊息,而內容只有:say_hello
一個參數。
John.say_hello #=> hello
John.send(:say_hello) #=> hello
#Ruby也支援這樣的寫法
John.send("say_hello") #=> hello
另外大家可能會對下面這種情況有點好奇,方法不是寫在我們自己定義的class裡面,而是直接定義。
def say(something)
puts something
end
say "hello world" # => hello world
看起來這個方法不屬於任何物件,但其實不是,Ruby偷偷的幫你塞進了Object這個class,我們在打字的這個空間,其實是Object這個class產生的一個實體main(main.rb)。
say "hello world" # => hello world
#跟上面這行基本上是一樣的
self.send(:say, "hello world") # => hello world
puts self #=> main
而實際上在Ruby中某物件呼叫方法的時候,則像是對這個物件傳送一個訊息,而訊息的內容則是這個方法的名字(以Symbol形式表示)以及這方法的參數。若這個物件有這個方法,則會執行。