标签:Hash String puts -- Symbol key string
引述
刚接触Ruby时,觉得很奇怪,哎呀,为什么有的Hash对象读取,是这样的 obj[:key],有的是这样的 obj["key"],它们有什么区别呢?
符号和字符串
首先,所有:key,冒号加上一个字符串组成的变量,都叫做符号(Symbol),它是Ruby中一种特殊的类型。它最常用的场景,就是作为Hash对象的key值使用。
Symbol和String有什么不同?
相同字面量的Symbol是全局共用一个对象,而每声明一个String对象,都会创建一个新的对象;
代码示例:
puts :symbol.object_id #906268
puts :symbol.object_id #906268
puts "string".object_id #60
puts "string".object_id #80
所以,虽然String也可以作为Hash的key值使用,但是由于每使用一个String字面量,都会创建一个对象,在内存效率方面更推荐使用Symbol作为Hash对象的key值。
Symbol和String互相转换
:symbol.to_s
"string".to_sym
Symbol和String作为Hash的key值时,可以互相取到对方的值吗?
答案是:不可以
hash = { :symbol => "test" }
puts hash["symbol"].nil? #true
hash = { "string" => "test" }
puts hash[:string].nil? #true
Symbol对于Hash的特殊声明形式
a = { symbol: "test" }
puts a["symbol"].nil? #true
puts a[:symbol].nil? #false
b = { "string": "test" }
puts b["string"].nil? #true
puts b[:string].nil? #false
证明,只要是:这样声明,而不是=>声明的Hash对象,key都会是符号
既然每一个String都是不同的对象,为什么String还可以作为Hash的key值,并保持存储中key唯一性呢
因为hash对象,比较key值是否相等,使用的是.eql?方法,等同于==
puts "string"=="string" #true
所有变量和方法的声明,都会对应的创建一个Symbol对象。Ruby使用符号来追踪变量、方法和常量创建时的名称。
#irb下的演示
2.7.2 :001 > Symbol.all_symbols.size
=> 6303
2.7.2 :003 > Symbol.all_symbols.grep(/rbrbrb/)
=> []
2.7.2 :005 > rbrbrb = 2
=> 2
2.7.2 :006 > Symbol.all_symbols.grep(/rbrbrb/) #这里使用grep,而不是include?("rbrbrb1") ,因为include自己会创建一个rbrbrb1符号到符号表,始终返回true,无法验证
=> [:rbrbrb]
2.7.2 :007 > Symbol.all_symbols.size
=> 6304
PIS:'json'这个基础库解析json字符串,JSONObject会映射成Hash对象,这里的key会映射成字符串而不是symbol
require 'json'
s ='{"name":"zhangsan","age":"18"}'
puts JSON.parse(s) #{"name"=>"zhangsan", "age"=>"18"}
标签:Hash,String,puts,--,Symbol,key,string 来源: https://www.cnblogs.com/forlllearning/p/16290898.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。