符号在拼音中的作用是什么?字符串和符号有什么区别?为什么动态创建大量符号不是一个好主意?
发布于 2011-01-01 20:38:47
无论在何处使用,符号都是相同的对象和相同的内存分配:
>> :hello.object_id
=> 331068
>> a = :hello
=> :hello
>> a.object_id
=> 331068
>> b = :hello
=> :hello
>> b.object_id
=> 331068
>> a = "hello"
=> "hello"
>> a.object_id
=> 2149256980
>> b = "hello"
=> "hello"
>> b.object_id
=> 2149235120
>> b = "hell" + "o"
两个字符串“相同”,因为它们包含相同的字符,它们可能不会引用相同的内存,这可能是低效的,如果您使用字符串进行散列。
因此,符号对于减少内存开销非常有用。然而,它们是一个等待发生的内存泄漏,因为一旦创建,符号就不能被垃圾收集。创建成千上万的符号会分配内存,并且是不可恢复的。呀!
发布于 2013-06-13 21:25:55
在没有根据某种白名单验证输入的情况下从用户输入创建符号可能特别糟糕(例如,对于RoR中的查询字符串参数)。如果在未经验证的情况下将用户输入转换为符号,则恶意用户可能会导致程序消耗大量内存,而这些内存永远不会被垃圾回收。
错误(无论用户输入如何,都会创建一个符号):
name = params[:name].to_sym
好(只有在允许用户输入的情况下才会创建符号):
whitelist = ['allowed_value', 'another_allowed_value']
raise ArgumentError unless whitelist.include?(params[:name])
name = params[:name].to_sym
发布于 2016-05-07 03:56:33
Starting Ruby 2.2和更高版本的Symbols会自动进行垃圾回收,所以这应该不是问题。
https://stackoverflow.com/questions/4573991
复制相似问题