001 Ruby小觀念與小技巧
description
Transcript of 001 Ruby小觀念與小技巧
30分鐘技術分享Ruby小觀念&技巧 By Bruce Li
2012/04/09雲端線上科技股份有限公司
12年4月11日星期三
目錄
• self是誰
• Symbol跟String的不同
• Ruby的自省能力
• ⼀一個小技巧
12年4月11日星期三
目錄
• self是誰
• Symbol跟String的不同
• Ruby的自省能力
• ⼀一個小技巧
12年4月11日星期三
self是誰
• 代表當前的object
• 在最上層時,則為預設(main)
12年4月11日星期三
規則程式區塊 範例 self代表
最上層區塊(method外) main
最上層區塊def m main
class內class C C
class內 def self.m Cclass內 def m C的instance
singleton def obj.m obj
module內module M M
module內 def m 混入M的物件
12年4月11日星期三
最上層區塊
main
main
12年4月11日星期三
Class內
12年4月11日星期三
Class內C
(class也是object)
12年4月11日星期三
Class內C
C(class
也是object)
12年4月11日星期三
Class內
#<C:0x007fbf9284de70>
C
C(class
也是object)
12年4月11日星期三
#<Object:0x007fd79b84f448>
singleton method
12年4月11日星期三
#<Object:0x007fd79b84f448>
singleton method
obj
=12年4月11日星期三
#<Object:0x007fd79b84f448>
singleton method
obj
=12年4月11日星期三
module內M
12年4月11日星期三
#<C:0x007fa8fb04e970>
module內M
C的instance
12年4月11日星期三
應用在宣告class method
(這段程式的用途...不要問!)
兩者都可以!因為self此時代表M用self的好處是更名時方便
不過被其他區塊蓋到的話可能會讓self變成代表別的物件
12年4月11日星期三
class也是object
KlassClass
undefined method `new'
內建的
(Klass這個class,是Class的instance object)12年4月11日星期三
呼叫method時省略小數點(.)
• 即是送訊息給self物件
12年4月11日星期三
呼叫method時省略小數點(.)
• 即是送訊息給self物件
• 與變數名稱相同時,變數優先
12年4月11日星期三
同名時
12年4月11日星期三
同名時
12年4月11日星期三
呼叫method時省略小數點(.)
• 即是送訊息給self物件
• 與變數名稱相同時,變數優先
12年4月11日星期三
呼叫method時省略小數點(.)
• 即是送訊息給self物件
• 與變數名稱相同時,變數優先• 不過打從⼀一開始就不應該取成同名
12年4月11日星期三
呼叫method時省略小數點(.)
• 即是送訊息給self物件
• 與變數名稱相同時,變數優先• 不過打從⼀一開始就不應該取成同名• 除了⼀一種狀況必須清楚指明self
12年4月11日星期三
呼叫等號結尾的methodRuby的syntax sugar
⤴
12年4月11日星期三
呼叫等號結尾的method
nil
Ruby的syntax sugar
⤴X
12年4月11日星期三
呼叫等號結尾的method
nil
Ruby的syntax sugar
⤴
12年4月11日星期三
呼叫等號結尾的method
nil
Ruby的syntax sugar
⤴
12年4月11日星期三
呼叫等號結尾的method
nil
Ruby的syntax sugar
⤴
30√12年4月11日星期三
目錄
• self是誰
• Symbol跟String的不同
• Ruby的自省能力
• ⼀一個小技巧
12年4月11日星期三
目錄
• self是誰
• Symbol跟String的不同
• Ruby的自省能力
• ⼀一個小技巧
12年4月11日星期三
Symbol跟String的不同
• 內容相同的symbol都代表同⼀一個物件
• 無法改變symbol的內容
• symbol效率比string好,很適合拿來當hash的index
12年4月11日星期三
代表同⼀一個物件1.9.2p290 :001 > "a".equal?("a") => false
1.9.2p290 :002 > :a.equal?(:a) => true
12年4月11日星期三
”equal?”的解說
• equal? 判斷是否指到同⼀一個object
• eql? 判斷是否value與type都相同
• == 判斷value是否相同(因此17==17.0)
12年4月11日星期三
1.9.2p290 :001 > "a" + "b" => "ab"
1.9.2p290 :002 > :a + :bNoMethodError: undefined method `+' for :a:Symbol
無法改變symbol的內容
12年4月11日星期三
目錄
• self是誰
• Symbol跟String的不同
• Ruby的自省能力
• ⼀一個小技巧
12年4月11日星期三
目錄
• self是誰
• Symbol跟String的不同
• Ruby的自省能力
• ⼀一個小技巧
12年4月11日星期三
Ruby的自省能力
• 自省:檢查某些事物以確定它是什麼、它知道什麼以及它能做什麼。
12年4月11日星期三
• class # "str".class => String
• is_a? # "str".is_a?(String) => true
• superclass # String.superclass => Object
• ancestors
• methods
• instance_methods
• singleton_methods
12年4月11日星期三
• protected_methods
• private_methods
• public_methods
• public_instance_methods
• protected_instance_methods
• private_instance_methods
12年4月11日星期三
• respond_to?
• 應用:x = :talkif obj.respond_to?(x) obj.__send__(x)end
12年4月11日星期三
只顯示在該class定義的methods:加上false
[:dm]
[:dm, :cm, :nil?, :===, :=~, :!~, :eql?, :hash, :<=>, :class, :singleton_class, ... (58個)
12年4月11日星期三
目錄
• self是誰
• Symbol跟String的不同
• Ruby的自省能力
• ⼀一個小技巧
12年4月11日星期三
目錄
• self是誰
• Symbol跟String的不同
• Ruby的自省能力
• ⼀一個小技巧
12年4月11日星期三
each with index
12年4月11日星期三
each with index
√
12年4月11日星期三
end
12年4月11日星期三
廣告雲端線上徵Rails/iOS/Android工程師中
‣ inside job board
我的技術&生活雜事部落格
‣ http://littlebmix.blogspot.com/
學習成功部落格
‣ http://ascend-er.blogspot.com/
12年4月11日星期三