开头:
Symbol是唯一且不会变动的识别名称,用冒号 (:) 开头,:name :"name" 都是合法的Symbol。 Symbol只是一个标记。
Symbol与字符串的区别就是 Symbol类型的同名变量 指向同一个地址,节约了内存。
例子一:
比如用生活中的例子来说明:Symbol
Symbol就像我们用水杯(物理地址:1240)装水,可以装饮用水、饮料(数据)等(物理地址:1800)。用1240 标记数据的位置1800
String 就像一次性纸杯装水,用不同(纸杯)地址标记(水)数据位置。
是不是用相同的水杯装不同的资源更节约一些呢。
例子二:
代码示例如下
a={:name=>"zgl"}
a.object_id #1280
a.each_key{|key| puts key.object_id} #71068
a.each_value{|value| puts value.object_id} #1300
a[:name].object_id #1300
b= {:name=>"text"}
b.object_id #1320
b.each_key{|key| puts key.object_id} # 71068
b.each_value{|value| puts value.object_id} #1340
b[:name].object_id #1340
#可以发现
a.each_key{|key| puts key.object_id} #71068
b.each_key{|key| puts key.object_id} # 71068
#他们指向了同一个地址
#我们用字符串试试呢
c ={"name"=>"zgl"}
c.each_key{|key| puts key.object_id} #1360
d = {"name":"text"}
d.each_key{|key| puts key.object_id} #71068
所以Symbol对于字符串 更节约内存,ruby中时常更喜欢使用 Symbol
无论何时,只要你是重用一个单词来反复代表其他东西,标志就能派上用场,就像用杯子装水。
不管是散列中的一个键,还是Http查询中的一个方法。