Re: [问题] 关于 类别方法 attr_reader

楼主: Beersheep (一心不乱)   2015-11-09 13:46:31
Ruby 当中,如果定义了 attr_accessor :name 的话,会产生两个 method
def name
@name
end
def name=(name)
@name = name
end
所以除非你去覆写这两个 method ,否则 name 之后都等于呼叫 name 这个 method
然后 return @name,所以除了 initialze 之外,name 都可以直接取代 @name。
取代 @name 的好处在于,如果有时候你需要对资料本身做一些处理,想要 output
处理后的数据,可以直接修改 method 就好。举例来说,今天你要显示电话,可是不想
显示出电话的最后三码,你可以直接做:
attr_reader :mobile
def mobile
# 假设电话号码是 0922-123-345
split_num = @mobile.split("-")
split_num[2] = "XXX"
@mobile = split_num.join("-")
end
当你 call mobile 的时候,它显示的就会是 0922-123-XXX 而非原本的号码。
另外一点要注意的是,当你使用 attr_accessor 或是 attr_writer 的时候,虽然
你可以用 name 来取代 @name ,但是当你创造一个新的 method,想要使用 setter 的
时候,例如:
def get_name
# 原本可能是 @name = gets.chomp
# name = gets.chomp 不行
self.name = gets.chomp
end
你如果不用 @name 的话,前面必须要加一个 self. 原因在于如果你没加 self 的
话,他会认为你是在 get_name 里面设一个 local variable,就无法 pass 到该物件的
name 去。

Links booklink

Contact Us: admin [ a t ] ucptt.com