Rob*_*ble 77
主要区别在于表示单个值的多个符号是相同的,而对于字符串则不是这样.例如:
irb(main):007:0> :test.object_id
=> 83618
irb(main):008:0> :test.object_id
=> 83618
irb(main):009:0> :test.object_id
=> 83618
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
3引用字符串"test",所有不同的对象.
这意味着使用符号可以根据应用程序节省大量内存.比较符号的速度也比较快,因为它们是同一个对象,比较相同的字符串要慢得多,因为需要比较字符串值而不仅仅是对象id.
至于什么时候使用它,我通常使用字符串几乎所有东西,除了哈希键之类的东西,我真的想要一个唯一的标识符,而不是字符串.
该声明
foo = "bar"
Run Code Online (Sandbox Code Playgroud)
在内存中创建一个新对象.如果我们重复声明
foo = "bar"
Run Code Online (Sandbox Code Playgroud)
我们创建另一个对象
为了更清楚地了解它,请在ruby控制台上尝试以下代码
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
Run Code Online (Sandbox Code Playgroud)
你会得到像这样的输出
string bar with object id = 70358547221180
string bar with object id = 70358548927060
Run Code Online (Sandbox Code Playgroud)
这清楚地表明相同的字符串有两个不同的对象.现在,如果你使用的符号,将创建每个符号一个对象等等
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
Run Code Online (Sandbox Code Playgroud)
节目
symbol bar with object id = 7523228
symbol bar with object id = 7523228
Run Code Online (Sandbox Code Playgroud)
这意味着只有一个对象:bar
进一步的符号是不可变的,你不能像:bar在符号上那样调用任何String方法.
比较符号比比较字符串要快.
符号可以被认为是常量/不可变字符串,它们形成一个唯一的集合,可以有效地转换为堆上的内存指针.这意味着比较两个符号很快,因为你只是比较2个整数(内存指针).
字符串是可变的,因此在修改后,堆上的值的内存指针可能会发生变化.这意味着比较操作较慢,因为可以存在语义上等效的重复项.
用途
使用upcase时,您确信该值将保持不变.示例使用哈希键的符号,当您想要更改值或想要对其使用字符串方法时使用字符串.
| 归档时间: |
|
| 查看次数: |
22017 次 |
| 最近记录: |