2008-10-31 191 views

回答

69

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

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。

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

+8

虽然符号不被垃圾收集清理,坚持围绕直到运行实例的结尾。所以如果你声明了很多符号,你可能会浪费大量的内存。 – Daemin 2008-10-31 22:17:01

+5

@Daemin:除非您动态创建符号,否则这通常不是问题。这是一些应用程序内存膨胀的原因。如果您在代码中使用硬编码的符号,则相对安全。 – Pistos 2008-10-31 23:45:05

1

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

而且刚刚发现这个通过谷歌,它可以提供更详细:Here you go

0

作为对比,我的一位朋友最近写了a post titled "Ruby Rant",它给出了Ruby符号的另一个看法。 StringSymbol之间

3

另外一个区别是,String上有字符串处理更大量的方法,而Symbol是一个相对稀对象。

查看String classSymbol class的文档。

0

符号是不可改变和字符串是可变的改变。

当我们对字符串执行任何操作时,它会创建一个新对象并采取修补。因为我们对字符串意味着越来越多的操作,所以我们消耗的内存越来越多。

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

获取更多信息,您可以click here

9

符号的定义&字符串之间的区别是什么?

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

Understanding Differences Between Symbols & Strings in Ruby

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

0

有字符串和符号在红宝石之间的两个主要区别。

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

    • 因为字符串是可变的,它可以在某个地方的变化,并可能导致的结果是不正确的。

    • 符号是不可变的。

  2. 字符串是一个对象,因此需要的内存分配

    提出 “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充分理解:

2

声明

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当你确信该值将保持不变。示例使用散列键符号, 当您想要更改值或想要使用字符串方法时使用字符串。

相关问题