Ruby 板


LINE

※ 引述《fuha (mimi)》之銘言: : 有關於symbol的用法上,小弟一直搞不是很懂?~ : symbol的使用時機、好處??? 因為我程式寫得不多,大部份只是無聊拿出來練練 所以這部份可能會說得不太對… @_@ 不過我個人覺得 :symbol 是個相當方便的機制 最主要就是拿來當 identifier 簡單地說,我們常常會有需要替一群的東西給定一個方便辨識身份的東西(id) 偶後我們可以用這個 id 去尋找那個人,算是一種快速而有效率的辨識法 因為你不必把整個東西拿來比較,你只要比較 id 就知道了 這裡舉一個簡單的例子,假設你要設定某樣東西的顏色 最單純的做法,就是用整數,像是 Java 有時候會寫成: class Color{ public static final int red = 0; public static final int green = 1; public static final int blue = 2; } 然後你要丟顏色給對方,可能寫成: setColor(Color.red) 會比你直接丟 0 給對方,要來得容易閱讀得多 至於 C++, 則會用 enum namespace color{ enum {red, green, blue}; } setColor(color::red); 可以省掉不少打字時間 當然,最容易閱讀與使用的方式,是字串,那麼根本無須設定, 只要知道那東西叫什麼名字就好: setColor("red"); 問題就在於,使用字串會遠比使用整數要來得花時間和空間 效能上並不太可取 於是,:symbol 的好處就是結合字串的方便與整數的效率 你同樣無須設定,直接使用: setColor(:red); 我不是很清楚 Ruby 的 :symbol 是怎麼做的,所以不知道真正的情況是如何 但我想他的便利與成本,應該是介於整數與字串之間吧 另一個值得一提的是,Ruby 可以藉由 symbol hash 來做 named arguments 比方說你要產生一個新視窗: Window.new 800, 600, 100, 100, 'XD', ... 這樣超級長的引數列有時候會看到,然而乍看之下根本不知道那些是指什麼 或是變成: window = Window.new window.setWidth(800); window.setHeight(600); window.setX(100); window.setY(100); window.setTitle('XD'); ... 這樣反而變得過於囉唆了,而且要寫一堆 method 有夠煩 於是,靠著 Hash 與 :symbol 我們可以這樣改寫: Window.new :x=>100, :width=>800, :title=>'XD', :height=>600, :y=>100 順序我故意打亂,因為順序並不重要,不需要去記順序 Ruby 有一個簡潔的做法,就是當你最後一個引數全部都是 key=>value 的形式 也就是像上面那樣的話,Ruby 會把這些 key=>value 包成一個 hash 傳進去 也就是,上面的呼叫實際上是: Window.new {:x=>100, ...} 然後,Window 的 c'tor 再去由這個 hash 去取出他所想要的值 C++ 的 boost 也有一個叫 parameter 的 lib, 就是實作上面的技巧 用起來有點彆扭,不像 Ruby 這麼自然,但還算可以用,如果不介意設定麻煩的話 使用上大概長這樣:(從官網上擷取的範例) core::depth_first_search(( graph = 'G', visitor = 2, root_vertex = 3.5, index_map = "hello, world", color_map = false)); 有一個額外的括號,因為那整串引數本身是一個 map(像是 Ruby 的 hash) 如果省略掉括號的話,就會變成語法不正確了 :) 就我所知,RoR 本身也是大量運用這樣的技巧,使得你不必去記參數順序, 也不必把一個 statement 拉成一大堆,使用起來相當便利 我覺得 Ruby 最厲害的地方就在於,他可以讓你的 client 變得非常簡潔 C++ 也是可以,問題是如果要提供這樣的 feature, lib 實作起來可是非常非常累的 所以說 Ruby 讓 programming 變得更好玩,並不是隨便說說的 :p -- Hear me exalted spirits. Hear me, be you gods or devils, ye who hold dominion here: I am a wizard without a home. I am a wonderer seeking refuge. Sacrifice --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.228.85.108
1F:推 dotZu:補充:Java 5也有enum了 12/18 17:53
2F:→ godfat:上次測試的感想是不好用,1.6 又出了 O_o 12/18 18:12
3F:推 fuha:我根據網路上的資料,都沒有讓我很清楚瞭解的範例~有誰可以推 12/18 18:37
4F:→ fuha:薦拿裡有比較好的學習symbol的範例嗎?~感謝回應阿 12/18 18:38
5F:推 godfat:有些東西是需要經驗累積的,有了經驗看了才會有感覺 :) 12/18 18:56
6F:推 fuha:感謝那麼詳盡的回答~ 12/18 19:10
7F:推 xamous:推~我剛看到 symbol 也很疑惑 後來發現幾乎只要把它當字串 12/18 23:01
8F:→ xamous:看就好了... 自己實驗一下,很多時候 symbol 跟字串的使用 12/18 23:02
9F:→ xamous:都是可以互換的... 12/18 23:02
10F:推 jtmh:我覺得重點在「唯一性」,也就是 godfat 大所說的 id. 12/19 05:30
11F:→ jtmh:Ruby 保證同一個 :symbol 一定是指向同一個 Symbol 物件, 12/19 05:31
12F:→ jtmh:而 Ruby 中的字串並沒有這個特性。 12/19 05:32
13F:推 SHBK:可以當hash的key, 節省space, 還有內部實作效率比較好~ 12/19 16:33







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP