还记得第一次用rails的时候被这火星文给震慑住
Rails.application.routes.draw do resources :people #这是什么意思??? :写错位置了吧?end
一问才知道原来是symbol
那symbol是什么呢?
在ruby里面什么东西都是物件
而symbol也只是个有名字的物件
你可以把它看成不能修改的字串
symbol vs. string
其实symbol在宣告的时候就已经在记忆体里面佔有一席之地了!
然而string就像个无业游民,每次叫他就又在另一个记忆体位址
p "hello".object_id #47132441787720 p "hello".object_id #47132441787480 p "hello".object_id #47132441787400 p :hello.object_id #1040988 p :hello.object_id #1040988 p :hello.object_id #1040988
上面的例子得知『在ruby每个字串都有不一样的记忆体位置』
而:hello就是给hello一个专属的记忆体位置
然而你也可以不透过symbol把"hello"存起来
a = "hello" p a.object_id #47367933032220 p a.object_id #47367933032220 p a.object_id #47367933032220
会发现其实a透过『位址』去找值
就只是没有个物件把它存起来罢了
ruby的参数是透过『传址不传值』这规则去实践的
那怎么用symbol?
在用之前需要知道symbol有一个特性,那就是不能修改
#你可以 p :hello.upcase #:HELLO p :HELLO.downcase #:hello p :hello.length #5 p :hello[0] #"h" #不能够 p :hello[0] = "i" #这样会喷错误讯息
symbol使用时机?
因为symbol不能修改的特性
往往会应用在不用去修改的资料上(废话
在hash的key就很常看到symbol的出现
my_symbol = { :hello => "symbol", "hello" => "string"}p my_symbol[:hello] # "symbol"p my_symbol["hello"] # "string"
symbol与string间的转换
转换方法有分为这几种
#字串转symbol p "name".to_sym <=常用 p "name".intern #symbol转字串 p :name.to_s <=常用 p :name.id2name
範围技转symbol
在ruby有个指令叫冰冻字串
#frozen_string_literal: true #没错,连#也要给他打下去 s = "abc" s[0] = "x" #会出错 p s
#frozen_string_literal: true
可以把整个程式码都冰冻住,不得修改
让程式可以跑快一点 (现在的我也感觉不出来快多少 XD
有範围技当然就有指定技啰!
s = "abc".freeze #.freeze就把字串冻住了! s[0] = "x" p s
总整理
symbol : 效能较佳 不能修改内容 转字串用.to_s
string : 效能较差 可以修改内容 转符号用.to_sym
效能有没有差异大概也要写到很大一包才有感觉吧?!