Ruby中的string和符号有什么区别?

Ruby中的string和符号有什么区别,什么时候应该使用另一个?

主要区别在于表示单个值的多个符号是相同的,而string则不然。 例如:

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引用string“test”,所有不同的对象。

这意味着使用符号可能会根据应用程序潜在地节省很多内存。 因为它们是相同的对象,因此比较符号的等同性也更快,因为比较相同的string要慢得多,因为string值需要比较而不仅仅是对象ID。

至于什么时候使用,我通常使用string几乎除了哈希键之外的东西,我真的想要一个唯一的标识符,而不是一个string。

符号和string有什么区别?

  1. 符号是不可变的:它们的值保持不变。
  2. 相同符号的多个用途具有相同的对象ID,并且是与string相同的对象,每次都是具有唯一对象ID的不同对象。
  3. 您不能调用任何string方法,如符号上的#upcase,#split。

从理解Ruby中符号和string的区别

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

StringSymbol之间的另一个区别是, String有更多的方法来处理string,而Symbol是一个相对较瘦的对象。

查看String类和Symbol类的文档。

该声明

 foo = "bar" 

在内存中创build一个新的对象。 如果我们重复这个陈述

 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 

这清楚地显示了同一个string有两个不同的对象。 现在,如果使用符号,它将为每个符号创build一个对象

 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

进一步的符号是不可变的 ,你不能调用任何string方法,如#upcase, #split符号上的#upcase, #split

比较符号比比较string更快。

符号可以被认为是形成唯一集合的常量/不可变string,这些集合被有效地转换为堆上的内存指针。 这意味着比较两个符号的速度很快,因为您只是比较两个整数(内存指针)。

string是可变的,所以内存指针在堆上的值可以在修改后改变。 这意味着比较操作比较慢,因为可以存在语义上相同的重复项。

用途

当您确定该值将保持不变时使用Symbol 。 示例使用散列键的符号,当您想要更改值或想要使用string方法时使用string。

符号是用来表示名称和string的东西。 当你需要多次使用一个string时,你会想要使用一个符号,因为这样更容易,更高效。

刚刚通过谷歌发现,这可能会提供更多的细节: 在这里你去

string是可变的,符号是不可改变的
注意:可变对象可以在赋值之后更改,而不可变对象只能被覆盖http://www.robertsosinski.com/2009/01/11/the-difference-between-ruby-symbols-and-strings/

符号和string是完全不同的这篇文章有一点洞察差异。 至于在何时何地使用它们,在这个主题上有一个相当广泛的post, 有很多:through 。

作为对比,我的一个朋友最近写了一篇题为“Ruby Rant”的文章 , 这篇文章再次介绍了Ruby的符号。

符号是不可变的,string是可变的。

当我们对string进行任何操作的时候,它会创build一个新的对象并采取修饰。 因为我们对string意味着越来越多的操作,我们正在消耗越来越多的内存。

符号是不可变意义的对象,如果我们执行任何操作,那么它执行原始对象的变化,它不会创build任何对象,这就是为什么它更有利可图。

欲了解更多信息,请点击这里

在Ruby中String和Symbol有两个主要的区别。

  1. string是可变的,Symbol不是

    • 因为String是可变的,所以可以在某个地方改变,并且可能导致结果不正确。

    • 符号是不可改变的。

  2. string是一个对象,所以它需要内存分配

    放“abc”.object_id#70322858612020

    放“abc”.object_id#70322846847380

    放“abc”.object_id#70322846815460

另一方面,符号会是你的同一个对象:

 puts :abc.object_id # 1147868 puts :abc.object_id # 1147868 puts :abc.object_id # 1147868 

所以string将需要更多的时间来使用和比较符号。

你可以在这里阅读更多,以充分理解: