首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么在ruby中动态创建大量符号不是一个好主意(对于2.2之前的版本)?

为什么在ruby中动态创建大量符号不是一个好主意(对于2.2之前的版本)?
EN

Stack Overflow用户
提问于 2011-01-01 20:05:42
回答 4查看 7.4K关注 0票数 66

符号在拼音中的作用是什么?字符串和符号有什么区别?为什么动态创建大量符号不是一个好主意?

EN

回答 4

Stack Overflow用户

发布于 2011-01-01 20:38:47

无论在何处使用,符号都是相同的对象和相同的内存分配:

代码语言:javascript
复制
>> :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"

两个字符串“相同”,因为它们包含相同的字符,它们可能不会引用相同的内存,这可能是低效的,如果您使用字符串进行散列。

因此,符号对于减少内存开销非常有用。然而,它们是一个等待发生的内存泄漏,因为一旦创建,符号就不能被垃圾收集。创建成千上万的符号会分配内存,并且是不可恢复的。呀!

票数 9
EN

Stack Overflow用户

发布于 2013-06-13 21:25:55

在没有根据某种白名单验证输入的情况下从用户输入创建符号可能特别糟糕(例如,对于RoR中的查询字符串参数)。如果在未经验证的情况下将用户输入转换为符号,则恶意用户可能会导致程序消耗大量内存,而这些内存永远不会被垃圾回收。

错误(无论用户输入如何,都会创建一个符号):

代码语言:javascript
复制
name = params[:name].to_sym

好(只有在允许用户输入的情况下才会创建符号):

代码语言:javascript
复制
whitelist = ['allowed_value', 'another_allowed_value']
raise ArgumentError unless whitelist.include?(params[:name])
name = params[:name].to_sym
票数 6
EN

Stack Overflow用户

发布于 2016-05-07 03:56:33

Starting Ruby 2.2和更高版本的Symbols会自动进行垃圾回收,所以这应该不是问题。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4573991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档