JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Languages on JVM » JRuby  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 Ruby的Symbol
semap





發文: 10
積分: 0
於 2006-11-21 11:52 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Ruby的Symbol是什麼?

我剛學Ruby時 一直不是很清楚, 相信對很多Ruby的初學者也有相同的問題.

很多大師也對Ruby Symbol下了不同的定義,

然而對我來說, Ruby Symbol是代表一個字串的符號, 並且有下面兩個特性

1. 不可變動性 (所代表的字串內容不可更改)
2. 唯一性 (系統中代表同一個字串的symbol 是同一個instance)

在Ruby中, Symbol也是一個class, 但是它並不是String的subclass.

Symbol class不提供 Symbol.new 讓我們使用,

如果要產生Symbol的instance要使這個方式
1
2
3
>x = :abc
 
=>:abc


上面程式告訴Ruby, 我要產生一個Symbol的instance, 他所代表的字串是"abc"
1
2
>x.class
=>Symbol


我們可以看出來, x的class是Symbol而不是String
1
2
3
4
5
6
>y = :abc
=>:abc
>x.object_id
=>243938
>y.object_id
=>243938


上面我們看出 Symbol的唯一性, x和y是同一個object. (因為x和y的object_id是一樣的)

瞭解了Symbol是什麼後, 重要的問題來了?
Symbol有什麼用? 也就是說Ruby為什麼要有Symbol?

嗯......有兩個原因第一是節省記憶體空間(space), 第二是增加執行時的效率(performance)

如果你是Java的programmer,應該知道, Java的String內容是不能改變的. 然後Ruby的String卻完全不是這麼一回事,
1
2
3
4
5
6
7
8
9
10
11
12
>m = "abc"
=>"abc"
>n = "abc"
=>"abc"
>m.object_id
=>23225030
>n.object_id
=>23222010
>m[0]="A"
=>"A"
>m
=>"Abc"

看出來了嗎? m和n都是字串"abc", 但是的卻是不同的instance (object_id不一樣), 而且字串的內容是可以修改的.

但是..........字串是程式中常常用到的, Ruby中的 每一個"abc", 其實都是 String.new("abc"),
如果我們程式中有太多的"abc", 那麼, Ruby就會create一堆的 String instance...., 所以如果我們可以在程式裡多用:abc 來取代"abc", 那麼就可以節省掉一些記憶體的空間. symbol最普遍應用的就是就屬hashmap的key值了.

Symbol第二個好處就是增加執行時的performance,

Symbol在ruby內部除了代表一個字串外, 其實也代表了一個數字

如果ruby執行到 m.do_something, 在Ruby的內部, 會在m中找一個名稱叫做 do_something, 如果Ruby用字串比對的方式在m中去找名稱叫 "do_something"的method, 那麼performance將會很低(因為字串的比對是很花時間的), 所以Ruby會將 "do_something"轉成 :do_something, 由於:do_something也代表了某個數字(假設代表的數字是34), 因為Ruby只要在m中尋找 34這一個method, 這樣比用字串比對去找"do_something"要快得多了....

所以在Ruby當中 m.do_something 事實上是呼叫 m.send(:do_something)


semap edited on 2006-11-24 11:39
reply to postreply to post
==================================

我的Blogger

http://semapwang.wordpress.com/

==================================
話題樹型展開
人氣 標題 作者 字數 發文時間
2770 Ruby的Symbol semap 1657 2006-11-21 11:52
2041 Re:Ruby的Symbol Duncan 312 2006-11-21 15:19
2173 Re:Ruby的Symbol semap 221 2006-11-24 11:38
» JWorld@TW »  Languages on JVM » JRuby

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8