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

Rea*_*nly 60 ruby string symbols

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

Rob*_*ble 77

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

irb(main):007:0> :test.object_id
=> 83618
irb(main):008:0> :test.object_id
=> 83618
irb(main):009:0> :test.object_id
=> 83618
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

3引用字符串"test",所有不同的对象.

这意味着使用符号可以根据应用程序节省大量内存.比较符号的速度也比较快,因为它们是同一个对象,比较相同的字符串要慢得多,因为需要比较字符串值而不仅仅是对象id.

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

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

Feu*_*uda 13

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

  1. 符号是不可变的:它们的价值保持不变.
  2. 对于相同符号的多次使用具有相同的对象ID,并且与每次都是具有唯一对象ID的不同对象的字符串相同是对象.
  3. 你不能在符号上调用任何字符串方法,如#split.

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

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


Gra*_*ins 5

String和之间的另一个区别Symbol是 aString有更多用于字符串操作的方法,而 aSymbol是一个相对精简的对象。

查看该类String该类Symbol文档。


Nit*_*791 5

该声明

foo = "bar"
Run Code Online (Sandbox Code Playgroud)

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

foo = "bar"
Run Code Online (Sandbox Code Playgroud)

我们创建另一个对象

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

foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
Run Code Online (Sandbox Code Playgroud)

你会得到像这样的输出

string bar with object id = 70358547221180
string bar with object id = 70358548927060
Run Code Online (Sandbox Code Playgroud)

这清楚地表明相同的字符串有两个不同的对象.现在,如果你使用的符号,将创建每个符号一个对象等等

foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
Run Code Online (Sandbox Code Playgroud)

节目

symbol bar with object id = 7523228
symbol bar with object id = 7523228
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

用途

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