简而言之,符号是轻量级字符串,但它们也是不可变的且不可垃圾收集的。
你应该而不是在你的数据处理任务中使用它们作为不可变的字符串(记住,一旦符号被创建,它就不能被销毁)。您通常使用符号来命名事物。
# typical use cases
# access hash value
user = User.find(params[:id])
# name something
attr_accessor :first_name
# set hash value in opts parameter
db.collection.update(query, update, multi: true, upsert: true)
我们来看第一个例子,params[:id]
。在一个适中的rails应用程序中,可能会有数百/数千个散布在代码库中的应用程序。如果我们用字符串params["id"]
访问该值,那意味着每次都有新的字符串分配(并且之后需要收集该字符串)。在符号的情况下,它实际上是到处都是相同的符号。内存分配,垃圾收集器和较少的工作,甚至你(:
快于""
输入)如果您有经常出现在你的代码一个简单的字串
,你不这样做时髦的东西给它(插值,gsub,upcase等),那么它可能是一个很好的候选符号。
但是,这是否仅适用于作为实际程序逻辑的一部分的文本,如命名,而不是实际运行程序时得到的文本...例如用户/ web等文本?
我想不出一个情况,我想将用户/网页上的数据转换为符号(除了解析命令行选项,也许)。主要是因为后果(一旦创造符号永远活着)。
此外,许多编辑者为符号提供不同的着色,以在代码中突出显示它们。看看这个例子
如果它让你感觉更好,Ruby的创建者本身并不真正理解何时使用字符串以及何时使用符号。 'Class.new.methods'返回1.8的字符串数组,1.9的符号数组返回。 :) – 2012-07-15 23:44:04
[在Ruby中理解符号]可能的重复(http://stackoverflow.com/questions/2341837/understanding-symbols-in-ruby) – 2016-08-30 11:33:39