Ruby中字符串和符号之间的区别是什么?何时应该使用另一个?
主要区别在于表示单个值的多个符号是相同的,而对于字符串则不是这样.例如:
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.
至于什么时候使用它,我通常使用字符串几乎所有东西,除了哈希键之类的东西,我真的想要一个唯一的标识符,而不是字符串.
符号和字符串有什么区别?
符号是不可变的:它们的价值保持不变.
对于相同符号的多次使用具有相同的对象ID,并且与每次都是具有唯一对象ID的不同对象的字符串相同是对象.
你不能在符号上调用任何字符串方法,如#split.
从了解Ruby中符号和字符串之间的差异
如果你是中国人,你也可以阅读理解Ruby符号
该声明
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
进一步的符号是不可变的,你不能像:bar
在符号上那样调用任何String方法.
比较符号比比较字符串要快.
符号可以被认为是常量/不可变字符串,它们形成一个唯一的集合,可以有效地转换为堆上的内存指针.这意味着比较两个符号很快,因为你只是比较2个整数(内存指针).
字符串是可变的,因此在修改后,堆上的值的内存指针可能会发生变化.这意味着比较操作较慢,因为可以存在语义上等效的重复项.
用途
使用upcase
时,您确信该值将保持不变.示例使用哈希键的符号,当您想要更改值或想要对其使用字符串方法时使用字符串.