iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 25
0
自我挑戰組

今晚我想來點 Ruby on Rails 系列 第 25

<Day 25>什麼是 Self & 怎麼使用它

  • 分享至 

  • xImage
  •  

如果你正在學 ruby 那可能會覺得當你在使用 "self" 會非常困惑,他是怎麼運作的?到底什麼是 "self"?

這是 ruby 給你的關鍵字,透過"self"你可以讀取目前這個物件,如果你不知道什麼是物件,那你可能要搞清楚,因為這跟物件導向程式設計有關,
讀取“當下這個物件“取決你的程式前後關係。前後關係?是的就是取決與你豆底在哪裡使用 "self"。舉個例子:

如果你的程式碼在一個實體方法裡面,那 "self" 就是在那個類別裡面的一個實體。換句話說,"self"是一個物件。

試著執行這段程式碼:

def coffee
  puts self
end
coffee
# main

這段程式碼定義並且呼叫了一個 coffee 方法,這個方法會印出"self"的值。那為什麼他會印出 main? 因為這是最高層級物件的名稱,這是一個物件,你可能也會在找到這些被定義在類別之外的方法。像是這裡的"coffee"方法。假設你在 cat 定義一個方法,那"self"就會是一個貓物件。

class Cat
  def meow
    puts self
  end
end
Cat.new.meow
# <Cat:0x7a14c5>

根據這些範例,我們可以說 "self" 的值取決於你在哪裡使用它。

到這裡我們先讓子彈飛一會...

two hours later...

相信你透過瞭解 "self",會對他如何使用更清楚。為什麼 "self" 有用?

其中一個實務上的用法是可以明確的指出方法跟變數的不同,如果你不小心把變數跟方法取同一個名字又或者你必須在那種環境下工作,那你就可以使用這招 self.method_name 呼叫方法,意思就是說:

class Example
  def do_something
    banana = "variable"
    puts banana
    puts self.banana
  end
  def banana
    "method"
  end
end
Example.new.do_something
# "variable"  => puts banana
# "method"    => puts self.banana

這裡我們有一個 banana 變數在 do_something 方法裡,但是我們也可以有一個 banana 方法。

在這裡如果我們想要呼叫 banana 方法,而不是印出 banana 變數的值,這就是為什麼我們需要使用 self,因為變數優先

我們看看較常見的例子,定義一個類別方法,使用 self 定義一個類別層級的方法。

首先,這些方法的定義會長這樣:

class Salad
  def self.buy_olive_oil
    # ...
  end
end
Salad.buy_olive_oil

這個 self 在這裡相當於 salad 這個類別,為什麼他有用,因為我們不需要對每個方法定義使用類別名稱,這讓我們更方便地去使用,如果今天我們改了這個類別的名稱。這也提高了程式碼的可讀性

這就是為什麼你應該使用 self.buy_olive_oil 而不是 Salad.buy_olive_oil

其他的用法

你可以在一個方法裡面對兩個物件做比較

先舉個例子:

def ==(other)
  self == other
end

你也可以使用 self 來 debug,來去找到你到底正在使用哪個物件。

舉個例子:

p self

又或者你可以使用 self 當一個回傳值,像這樣:

class Salad
  def initialize
    @ingredients = []
  end
  def add_nuts
    @ingredients << :nuts
    self
  end
end
my_salad = Salad.new.add_nuts

總的來說,"self"有很多種用法

Define class-level methods
Use an instance method when you have a local variable of the same name
Returning Self (builder pattern)
Debugging
Comparing objects (==)
Default receiver of method calls
Self vs Itself

以上這些有興趣都可以深入研究,寶藏就在那,自己去找吧


上一篇
<Day 24>今晚我想來點form_with
下一篇
<Day 26>helper_method & helpers
系列文
今晚我想來點 Ruby on Rails 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言