Ruby中字符串和符号之间的区别是什么以及什么时候应该使用另一个?Ruby中的字符串和符号有什么区别?
回答
主要区别在于代表单个值的多个符号是相同的,而字符串则不然。例如:
irb(main):007:0> :test.object_id
=> 83618
irb(main):008:0> :test.object_id
=> 83618
irb(main):009:0> :test.object_id
=> 83618
3引用符号:测试,所有相同的对象。
irb(main):010:0> "test".object_id
=> -605770378
irb(main):011:0> "test".object_id
=> -605779298
irb(main):012:0> "test".object_id
=> -605784948
3引用字符串“test”,所有不同的对象。
这意味着使用符号可能会根据应用程序潜在地节省很多内存。因为它们是相同的对象,因此比较符号的等同性也更快,因为比较相同的字符串要慢得多,因为字符串值需要比较而不仅仅是对象ID。
至于何时使用哪个,我通常使用字符串几乎除了哈希键之类的东西,我真的想要一个唯一的标识符,而不是一个字符串。
符号是用来表示名称和字符串的东西。如果您可能需要多次使用字符串,您会希望使用符号,因为这样更容易,更高效。
而且刚刚发现这个通过谷歌,它可以提供更详细:Here you go
符号和字符串是完全不同的this post有一个小洞察的差异。至于何时何地使用它们,在has many :through上有相当广泛的帖子。
作为对比,我的一位朋友最近写了a post titled "Ruby Rant",它给出了Ruby符号的另一个看法。 String
和Symbol
之间
另外一个区别是,String
上有字符串处理更大量的方法,而Symbol
是一个相对稀对象。
查看String
class和Symbol
class的文档。
字符串是可变的,符号皆为不变
注:可变对象可分配之后,而不可变对象只能 覆盖 http://www.robertsosinski.com/2009/01/11/the-difference-between-ruby-symbols-and-strings/
符号是不可改变和字符串是可变的改变。
当我们对字符串执行任何操作时,它会创建一个新对象并采取修补。因为我们对字符串意味着越来越多的操作,所以我们消耗的内存越来越多。
符号是不可改变的对象,如果我们执行任何操作,那么它执行原始对象的更改,它不会创建任何对象,这就是为什么它更有利可图。
获取更多信息,您可以click here
符号的定义&字符串之间的区别是什么?
- 符号是不可变的:它们的值保持不变。
- 相同符号的多个用途具有相同的对象ID,并且与字符串相比是相同的对象,每次都是具有唯一对象ID的不同对象。
- 您无法调用像符号上的#upcase,#split这样的任何字符串方法。
从Understanding Differences Between Symbols & Strings in Ruby
如果你是中国人,你也可以阅读理解 Ruby Symbol
有字符串和符号在红宝石之间的两个主要区别。
字符串是可变的,符号不是
因为字符串是可变的,它可以在某个地方的变化,并可能导致的结果是不正确的。
符号是不可变的。
字符串是一个对象,因此需要的内存分配
提出 “ABC” .object_id#70322858612020
看跌期权 “ABC” .object_id#70322846847380
看跌期权 “ABC”。 object_id#70322846815460
另一方面,Symbol会为你e相同的对象:
puts :abc.object_id # 1147868
puts :abc.object_id # 1147868
puts :abc.object_id # 1147868
所以字符串将需要更多的时间来使用和比符号。
你可以阅读更多here充分理解:
声明
foo = "bar"
在内存中创建一个新的对象。如果我们重复声明
foo = "bar"
我们创建另一个对象
让它更清楚,请尝试红宝石控制台下面的代码
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
你会得到输出像
string bar with object id = 70358547221180
string bar with object id = 70358548927060
其清楚地显示存在用于相同的字符串两个不同的对象。现在,如果你使用的符号,将每个符号创建一个对象,以便
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
显示
symbol bar with object id = 7523228
symbol bar with object id = 7523228
,这意味着只有一个对象为:酒吧
进一步的符号是不变并且您无法调用符号上的任何字符串方法(如#upcase, #split
)。
比较符号是不是比较字符串快。
符号可以认为形成一组唯一的被有效地转换成存储器指针在堆上作为常数/不可变的串。这意味着在比较两个符号是快的,因为你只是比较两个整数(内存指针。)
字符串是可变的,所以内存指针,其价值在堆中可以修改后更改。这意味着比较操作比较慢,因为可以存在语义上相同的重复项。
用途
使用Symbol
当你确信该值将保持不变。示例使用散列键符号, 当您想要更改值或想要使用字符串方法时使用字符串。
- 1. Ruby中的字符串和符号有什么区别?
- 2. golang中的[]字符串和...字符串有什么区别?
- 3. 在C#中。字符串和字符串有什么区别?
- 4. Ruby中的String.new与字符串文字有什么区别?
- 5. 字符串和Javascript中的字符数组有什么区别?
- 6. R中的字符串和字符有什么区别?
- 7. Ruby中的符号和变量有什么区别?
- 8. C字符串和C++字符串有什么区别?
- 9. 字符串和字符串有什么区别?
- 10. COM字符串(BSTR)和.NET字符串有什么区别?
- 11. Ruby字符串扫描和匹配有什么区别
- 12. “interned”和“uninterned”符号有什么区别
- 13. nohup和&符号有什么区别
- 14. Ruby:使用引号初始化字符串与冒号有什么区别?
- 15. 零售符号和选中符号有什么区别?
- 16. 两个字符串有什么区别?
- 17. 字符串,CString,QString有什么区别?
- 18. Golang中的*字符串和字符串之间有什么区别?
- 19. PHP中单引号和双引号字符串有什么区别?
- 20. 在C#中的区别是什么:字符串VS字符串
- 21. 在.NET中字符串实习和字符串合并有什么区别?
- 22. char []和C++中的字符串有什么区别?
- 23. 查找Ruby中字符串的区别
- 24. 正常字符串和'%s'格式的字符串有什么区别?
- 25. groovy中的单引号或双引号内的字符串有什么区别?
- 26. Ruby:空字符串和空字符串有什么不同?
- 27. %和,在一个字符串中有什么区别?
- 28. Python字符串格式化中%s和%d有什么区别?
- 29. C中的字符串和ASCII字符串有区别吗?
- 30. 打印和格式化字符串文字有什么区别?
虽然符号不被垃圾收集清理,坚持围绕直到运行实例的结尾。所以如果你声明了很多符号,你可能会浪费大量的内存。 – Daemin 2008-10-31 22:17:01
@Daemin:除非您动态创建符号,否则这通常不是问题。这是一些应用程序内存膨胀的原因。如果您在代码中使用硬编码的符号,则相对安全。 – Pistos 2008-10-31 23:45:05