当前位置:  开发笔记 > 后端 > 正文

Ruby中的字符串和符号之间有什么区别?

如何解决《Ruby中的字符串和符号之间有什么区别?》经验,为你挑选了3个好方法。

Ruby中字符串和符号之间的区别是什么?何时应该使用另一个?



1> Robert Gambl..:

主要区别在于表示单个值的多个符号是相同的,而对于字符串则不是这样.例如:

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引用符号:test,所有相同的对象.

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.

至于什么时候使用它,我通常使用字符串几乎所有东西,除了哈希键之类的东西,我真的想要一个唯一的标识符,而不是字符串.


尽管垃圾收集器不会清除符号,但直到运行时实例结束时才会粘贴符号.因此,如果您声明了很多符号,那么您可能会浪费大量内存.
@Daemin:除非您动态创建符号,否则这通常不是问题.这是某些应用程序内存膨胀的原因.如果您在代码中使用硬编码符号,则相对安全.
我不确定我理解你的第一句话.当人们说每个雪花都是独一无二的时候,就意味着每个雪花都是不同的.每次出现都与另一次不同.但是,在符号代码示例中,您将每个匹配项显示为完全相同的对象."相同"会不是一个更好的词?

2> Feuda..:

符号和字符串有什么区别?

    符号是不可变的:它们的价值保持不变.

    对于相同符号的多次使用具有相同的对象ID,并且与每次都是具有唯一对象ID的不同对象的字符串相同是对象.

    你不能在符号上调用任何字符串方法,如#split.

从了解Ruby中符号和字符串之间的差异

如果你是中国人,你也可以阅读理解Ruby符号



3> Nitin9791..:

该声明

foo = "bar"

在内存中创建一个新对象.如果我们重复声明

foo = "bar"

我们创建另一个对象

为了更清楚地了解它,请在ruby控制台上尝试以下代码

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

这意味着只有一个对象:bar

进一步的符号是不可变的,你不能像:bar在符号上那样调用任何String方法.

比较符号比比较字符串要快.

符号可以被认为是常量/不可变字符串,它们形成一个唯一的集合,可以有效地转换为堆上的内存指针.这意味着比较两个符号很快,因为你只是比较2个整数(内存指针).

字符串是可变的,因此在修改后,堆上的值的内存指针可能会发生变化.这意味着比较操作较慢,因为可以存在语义上等效的重复项.

用途

使用upcase时,您确信该值将保持不变.示例使用哈希键的符号,当您想要更改值或想要对其使用字符串方法时使用字符串.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有