iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 12
0
Modern Web

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

Ruby on Rails面試題挑戰 Day12 - 在Ruby中的self是什麼?我們什麼時候會使用self?

What is self and when do we use “self” in Ruby?
在Ruby中的self是什麼?我們什麼時候會使用self?


要回到這個問題首先要了解self是什麼

self在Ruby中是一個很特別的存在,永遠指向正在執行的那個物件。
下面直接舉程式碼來說明會更加清楚。

class Dog
  p self # => Dog
  
  def bark
    p self
  end
  
  def self.eat
    p self
  end
end

dog1 = Dog.new
dog1.bark  # => #<Dog:0x000055631b5a1710>
p dog1     # => #<Dog:0x000055631b5a1710>

Dog.eat  # => Dog

我們在三種不同的地方印出self

  1. 在Dog類別中(沒有包在任何方法裡面),self是Dog類別本身
  2. 包在實體方法bark裡面,後來由dog1實體呼叫,self是呼叫bark方法的dog1實體本身
  3. 在類別方法裡面,會指向呼叫他的類別Dog

那如果直接在irb中打上self呢?

p self # => main

p self.class # => Object

會印出mainmain是所謂Ruby程式的上層(top level),是我們輸入Ruby程式碼的這個區域,是一個叫做main的物件,由Object這個類別所生出來的。沒想到我們輸入程式碼的地方也是個Ruby的物件,但這個物件有其特殊的地方,與其他的Ruby物件不同。例如下面這種情況

def say_hello
  puts "hello"
end

p self.private_methods.include?(:say_hello)
# => true

當我們在main這個物件中定義say_hello方法時,卻會被歸類在Object這個類別的private instance method中,根據Ruby之父Matz在這個討論串解釋了當初這樣設計的理由:因為比較自然。

了解self以後,何時會用到self呢?

  1. 定義類別方法的時候
  2. 用來debug,知道現在所使用的物件是什麼

你可以這樣回答:

self會指向正在執行的那個物件,若定義在類別方法中,會指向該類別。若定義在實體方法中,self會指向呼叫該方法的實體。

而我們使用self的時機是來定義類別方法的時候,以及debug來確認自己所正在使用物件的時候。

參考資料

  1. Ruby doc - self
  2. Ruby user's guide - Variables
  3. 為你自己學 Ruby on Rails - 類別(Class)與模組(Module)
  4. Ruby 裡的 self 是什麼意思
  5. ruby的top-level

上一篇
Ruby on Rails面試題挑戰 Day11 - proc與lamba的差異是什麼?
下一篇
Ruby on Rails面試題挑戰 Day13 - 不要使用“resources”的情況下,定義一條route給create action
系列文
Ruby on Rails面試題挑戰30

尚未有邦友留言

立即登入留言