在Ruby的世界所有的東西都是物件,連符號也不例外。
什麼是符號symbol?
在學習Ruby的路上,教材內時常會出現符號symbol,就是前面帶有:的物件,或許略懂概念但若要操作我還真是不知道怎麼下手。
symbol在所有程式語言裡是一個特別的存在!其作用很容易讓它與字串混淆,在介紹symbol之前,先來談談什麼是變數?
先聊聊變數,再談符號
變數就像是標籤、像代名詞,試著想:
我好多袋子,在我還沒放入東西之前他們都沒有特別存在的意義,去一趟超市回來,買了高麗菜、雞胸肉、草莓,基於衛生緣故各自分裝成三袋,為了不要拿錯我在袋子上貼上了標籤,
蔬菜=”玉米筍”
肉類=”雞胸肉”
水果=”草莓
在這邊我的變數就是蔬菜、肉類、水果,他們各自帶的值就是高麗菜、雞胸肉、草莓。
但是一個人習慣,前面所謂的為食材“分類貼標籤”,也就是設定變數,是可以更改的,我也可以把食材們改成碳水化合物、蛋白質、膳食纖維…(但我不會👻 );
同樣的,我每天去超市買的食材也不會都一樣,所以我後面帶入的值,也可以更改的。
今天小表妹來家裡蹭吃蹭飯,他跟我點菜要吃“小玉米”配“葡萄酒”,她所謂的小玉米就是玉米筍、葡萄酒就是葡萄汁,所以在確認晚餐內容時,就要用她獨一無二的命名確認,今晚吃:雞肉焗烤佐小玉米飯配上甜甜的葡萄酒!
而這個獨一無二的命名就是所謂的符號symbo,對小表妹而言,即使她長大了跟朋友到老四川吃火鍋時,點菜仍然會說“我要吃小玉米!”😆
小重點:
- Symbol與變數的差別?
其用法完全不同,所以差很大!變數就指向某物件的名字,是一個標籤;
而symbol一個值,是個本身就帶著名字的物件。 - Symbol等於字串?
symbol與字串最大的不同就是,字串的內容是可以更改的,但symbol不行
先說字串,今天有一段午餐程式碼,
午餐=”茶葉蛋”,我也可以說午餐=“蛋白質”
而小表妹的小玉米你就不能直接跟她說玉米筍,她可能會瞬間聽不懂中文了 - symbol的效能比字串差?
可以用object_id來看字串跟符號的id,會發現字串每次產出的id都不同,因此有效能較符號好的說法,
但實際上!人類應該是感受不到的這微小的差異,
而且,可以使用“to_sym”與“intern”互相作轉換。
Symbol的應用:
最常見的地方就是在Hash裡了,因為其不可更改的特性,非常適合拿來當作Hash裡面的key。而且字串可以使用的方法比較多,如果symbol要使用的話就還要先轉換,就比別人多做一個動作了。
如果是這樣呢?
前幾天我有個想法,在音樂及樂譜的世界:
變數就像是譜的名字或我給這段旋律的名字
1 | so mi mi fa re re 這段旋律我叫他「變數:小蜜蜂」 |
而「“so mi mi fa re re”」就是我給「小蜜蜂」這個變數的字串,我也可以改寫成簡譜,「“5 3 3 4 2 2”」,
將它程式化就是:
1 | 小蜜蜂=“so mi mi fa re re” |
那符號是不是就像是我唱出來的聲音,你無法抓住聲音定義他為變數,且每個音都是獨一無二;
說到符號可以當作Hash裡的key,我突然聯想到,名偵探柯南劇場版戰慄的樂譜,最後柯南與歌手被困在湖中的小船上,遠的要命有個緊急電話亭,但距離太遠根本無法使用聽筒溝通,因此他們運用聲音來撥打110,在你拿起電話的同時我們已經開始與電信局聯繫了,就等著你下指令去啟動,其實電話的按鍵產生的聲音就是會成為一組信號傳遞給電信局,他才會知道你要打給110,這些都是我看完電影去查的資訊,誰說去電影院看卡通是浪費錢?我可是學到很多滴~更多分析
看完覺得實在是很神奇耶,以前我家都會先按免持撥號,等確定有人接起來再拿起話筒;而我最常打給爸爸,我現在都還記得他手機那十個數字按鍵的聲音,所以在唸我爸手機電話時可以用說唱的方式(?)
因為他也是smybol,不可以亂變動不然電信局會get不到😹 😽 😺 扯遠了~