iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 18
0
Software Development

Ruby 研究 30 天系列 第 18

Day 17 - Singleton Method

  • 分享至 

  • xImage
  •  

Singleton Method

只屬於一個物件的方法

類別方法?實體方法?

class Class
  def haha
    puts "hahaha~"
  end
end

Integer.haha   # 印出 hahaha~
String.haha    # 印出 hahaha~

這裡舉出這個例子是想說明,如果乍看 Integer.haha ,寫法很像類別方法,但是這裡用開放類別, Integer 跟String 都是 Class 的實體,因此這裡是實體方法,像這樣的寫法,大家都可以用。

如果我的方法只想給某個物件用呢?

class Engineer
  def book_list_1
    puts "ruby on rails"
  end
end

full_stack = Engineer.new
backend = Engineer.new

def full_stack.book_list_2     # 這裡定義一個方法指定給 full_stack
  puts "HTML & CSS"
end

full_stack.book_list_1         # 印出 ruby on rails
backend.book_list_1            # 印出 ruby on rails
full_stack.book_list_2         # 印出 HTML & CSS
backend.book_list_2            # undefined method `book_list_2' for #<Engineer:0x000055ad3efe0650>

可以發現用 object.method 這個寫法也有結果跑出來,而且還能限制不讓別的 instance 使用,原來這種只屬於一個物件的方法,就叫做 singleton method

full_stack.singleton_methods   # 印出 [:book_list_2]

補充:在 Ruby 中,對物件使用 .singleton_methods 方法可列出其所有 singleton methods 。

那麼類別方法也一樣能寫出 singleton method 嗎?

class OOP
  def self.rule_1
    puts "don't repeat yourself"
  end
end

def OOP.rule_2
  puts "convention over configuration"
end

OOP.singleton_methods      # 印出 [:rule_1, :rule_2]

不僅僅可以,我們甚至發現原來類別方法就是一種 singleton method ,那真的只有一個物件能夠使用嗎?

class OOP
  def self.rule_1
    "don't repeat yourself"
  end
end

def OOP.rule_2
  "convention over configuration"
end

class Rails < OOP; end

Rails.rule_1                # 印出 "don't repeat yourself"
Rails.rule_2                # 印出 "convention over configuration"
Rails.singleton_methods     # 印出 [:rule_1, :rule_2]

其實無論是類別方法或實體方法透過繼承就能使用。

https://ithelp.ithome.com.tw/upload/images/20191122/2012082389cc41iHse.png

明天的篇幅會是比較需要想像的,更具體的找出 singleton method 的脈絡。

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


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

尚未有邦友留言

立即登入留言