iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 16
1
Software Development

Ruby 研究 30 天系列 第 16

Day 15 - self

self

在 Ruby 裡有四種變數(全域變數、區域變數、實體變數以及類別變數)、一種常數(字首大寫者)以及兩種擬變數 (pseudo-variable)。

  • 其中變數與常數不需要宣告型別,造就了 Ruby 的方便與快捷。
  • 兩種擬變數中,nil 代表無意義值,self 則表示永遠指示目前正在執行的物件。

在更早之前的學習經驗裡,我們可以定義一個方法,然後直接呼叫方法名稱來使用,但經過昨天的探討,大部分方法前面不都應該接一個物件嗎?

你知道self早就存在了嗎?

https://ithelp.ithome.com.tw/upload/images/20191122/20120823K9HkckV596.png

def fat_thor
  puts " I'm still worthy! "
end

self.fat_thor
# 印出 private method `a_method' called for main:Object

self.private_methods.include?(:fat_thor)    # 印出 true

p self                                      # 印出 main

p self.class                                # 印出 Object

private_methods 檢驗一下, fat_thor 果真是從 self 所屬的 class 定義的,而 self 代表 main,self 是 Object 的實體

難道什麼 scope 都沒寫就代表在 Object 裡?

這裡用開放類別來測試一下:

class Object
  p self

  def stark
    puts " I love 3000! "
  end
end
# 印出Object

self.stark    # 印出 I love 3000! 
stark         # 印出 I love 3000! 

可以直接呼叫方法


整理一下:

  1. self 可以想成該 scope 的值(即可以用 self 確認所在的 scope),而 scope 的尋找方法可看成找最接近的 object ,在實體方法中就是實體,在類別方法中當然就是類別自己。

  2. 未宣告任何 local scope 之前,我們處在 top level scope,在這裡 self 本身帶有值並自稱 main,查找 main:Objectc 會得到一組 hash{main=>Objectc}

  3. 在 top level scope 寫出的方法可以直接呼叫,但為 private 方法;在 Object 中則是 public 方法,可以掛在 self 身上呼叫,卻也能直接呼叫,難道 main 某種程度上等同 Object?

  4. 參考一些資料,在 OOP 中的 method 幾乎都可表現為 obj.method_name(private 除外),此時物件(obj)為訊息接收者(reciever),method_name 代表訊息(messege),而該 method 所屬的 scope 為訊息傳遞者(sender)。

此文同步刊登於CJ-Han的網站


上一篇
Day 14 - 類別方法與實體方法
下一篇
Day 16 - 方法的呼叫
系列文
Ruby 研究 30 天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言