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有什么区别?
- 符号是不可变的:它们的值保持不变。
- 相同符号的多个用途具有相同的对象ID,并且是与string相同的对象,每次都是具有唯一对象ID的不同对象。
- 您不能调用任何string方法,如符号上的#upcase,#split。
从理解Ruby中符号和string的区别
如果你是中国人,你也可以阅读理解Ruby Symbol
String
和Symbol
之间的另一个区别是, 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有两个主要的区别。
-
string是可变的,Symbol不是
-
因为String是可变的,所以可以在某个地方改变,并且可能导致结果不正确。
-
符号是不可改变的。
-
-
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将需要更多的时间来使用和比较符号。
你可以在这里阅读更多,以充分理解: