iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 6
0
Modern Web

Ruby on Rails面試題挑戰系列 第 6

Ruby on Rails面試題挑戰 Day06 - 當你在Ruby中呼叫方法的時候發生了什麼事?

前一篇介紹了方法以及實體方法與類別方法的不同,方法這個東西在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形式表示)以及這方法的參數。若這個物件有這個方法,則會執行。

參考資料

  1. Ruby Programming/Syntax/Method Calls
  2. 為你自己學 Ruby on Rails

上一篇
Ruby on Rails面試題挑戰 Day05 - 類別方法與實體方法差異是什麼?
下一篇
Ruby on Rails面試題挑戰 Day07 - 請談談Ruby中的getter和setter
系列文
Ruby on Rails面試題挑戰30

尚未有邦友留言

立即登入留言