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

时间:2008-10-31 21:57:37

标签: ruby string symbols

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

11 个答案:

答案 0 :(得分:73)

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

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。

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

答案 1 :(得分:10)

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

  1. 符号是不可变的:它们的值保持不变。
  2. 同一个符号的多次使用具有相同的对象ID,并且与每次都是唯一对象ID的不同对象的字符串相同。
  3. 您无法调用任何字符串方法,例如#split on Symbols。
  4. 来自Understanding Differences Between Symbols & Strings in Ruby

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

答案 2 :(得分:5)

声明

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

其他符号不可变,您无法在符号上调用#upcase, #split之类的任何字符串方法。

比较符号比比较字符串更快。

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

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

<强>用途

当您确定该值保持不变时,请使用Symbol。示例使用哈希键的符号, 如果要更改值或想在其上使用字符串方法,请使用字符串。

答案 3 :(得分:3)

StringSymbol之间的另一个区别是,String在字符串操作方面有更多方法,而Symbol是一个相对精简的对象。

查看String classSymbol class

的文档

答案 4 :(得分:1)

符号是您用来表示名称和字符串的东西。当您需要多次使用字符串时,您可能希望使用符号,因为这样更容易,更有效率。

刚刚通过谷歌发现了这一点,可能会提供更多细节:Here you go

答案 5 :(得分:1)

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

答案 6 :(得分:1)

Ruby中String和Symbol之间存在两个主要区别。

  1. 字符串是可变的,而符号不是

    • 因为String是可变的,所以它可能在某处发生变化并导致结果不正确。

    • 符号是不可变的。

  2. String是一个Object,因此需要内存分配

    put&#34; abc&#34; .object_id#70322858612020

    put&#34; abc&#34; .object_id#70322846847380

    put&#34; abc&#34; .object_id#70322846815460

  3. 另一方面,Symbol会给你相同的对象:

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

    因此字符串将花费更多时间来使用和比较符号。

    您可以阅读更多here以完全理解:

答案 7 :(得分:1)

符号可能会成为灾难的情况。可以说你有 params.map(&:to_sym)在rails控制器中。 现在在这里,如果由于某种原因将用户提供的数据转换为符号,则可能很危险。如果用户提供的数据太大,并且我们知道该符号不是垃圾收集器,您可能最终会耗尽服务器的内存,这可能会导致您的网站瘫痪。

答案 8 :(得分:0)

符号和字符串完全不同this post对差异有一点了解。至于何时何地使用它们,has many :through上有关于此主题的相当广泛的帖子。

答案 9 :(得分:0)

作为一个对立点,我的一位朋友最近写了a post titled "Ruby Rant",再看看Ruby符号。

答案 10 :(得分:0)

符号是不可变的,字符串是可变的。

当我们对字符串执行任何操作时,它会创建一个新对象并占用内存。随着我们对字符串意味着执行越来越多的操作,我们正在消耗越来越多的内存。

符号是不可变的对象意味着如果我们执行任何操作然后它在原始对象中执行更改,它将不会创建任何对象,这就是为什么它更有利可图。

了解更多信息,您可以click here