over 2 years ago

此篇主要筆記 attr_reader, attr_writer, 和 attr_accessor 的用法與差別

Differences

attr_reader

attr_reader 做的事情其實就是幫忙定義 instance method,如此我們就可以藉由這個 instance method 取得 instance variable 的值。舉例說明:

class User
  attr_reader :email
end

意思就是幫你定義一個叫做 email的 instance method 去取得 email 這個 instance variable 的值:

class User
  # 為避免混淆,這裡省略 initialize method

  def email
    @email
  end
end

所以我們就才可以對 User 的 Instance Object 問 email:

user = User.new(email: "wayne@example.com")
user.email
# => wayne@example.com

attr_writer

相較於 attr_reader 是讓我們取得 instance variable 的值, attr_writer 則是讓我們指派 instance variable 的值。

class User
  attr_writer :email
end

其實意思就是:

class User
  def email=(email)
    @email = email
  end
end

這樣我們就可以在 new 完 User 的 instance object 之後再 assign @email 的值給它:

user = User.new
user
# => <User:0x0000010ef74c48>

user.email = "wayne@example.com"
user
# => <User:0x0000010ef74c48 @email="wayne@example.com">

attr_accessor

attr_accessor 簡單來說就是 attr_readerattr_writer 的綜合體,舉例如下:

class User
  attr_accessor :email
end

其實意思就是:

class User
  def email
    @email
  end
  def email=(email)
    @email = email
  end
end

這樣寫有什麼好處呢?

其實這樣就是節省時間以及讓 code 變得更乾淨,想像一下今天有一個 class 有 5 個 attributes,那不就要定義 10 個長得很像的 method 來 指派/存取 instance variable 的值?身為懶人工程師是不可以讓這件事情發生的,所以這時如果可以一行寫完這些 method 不是很好嗎?於是有了以下的寫法:

class User
  attr_accessor :name, :email, :address, :age, :gender
end

通常我們會把 attr_accessor 這類的 method 放在 class 的最上面,這樣一進來就可以很清楚地知道有哪些 method 可以使用。

參考資料:

RubyDoc - attr_accessor
RubyDoc - attr_reader
RubyDoc - attr_writer

← Integrate Stripe Subscription in Rails iOS - FB Login - Swift - Tutorial and Example →
 
comments powered by Disqus