Symbol类

1.两种形式:一种是直接冒号加名字,一种是冒号加字符串

2.在一文本中,同一Symbol对象表示的类名,方法名,变量指向同一个Symbol对象

3.对于可变的使用String,不可变的使用Symbol

4.Symbol新特性

1.两种形式:一种是直接冒号加名字,一种是冒号加字符串
#下面两种就是Symbol对象的两种表现形式
:test
:"test"
#上面的两种形式表示的是同一个对象,就是具有相同的object_id,指向同一个内存地址。
 :test.object_id #=>355868
:"test".object_id #=>355868
#即是名字相同,symbol相同,:test和:“test”是形同的名字,所以他们是相同的symbol。
#但是如果是:@test和:test是不同的名字,所以他们是不同的symbol。
:@test.object_id # 1148868
:test.object_id # 355868
#区别于两个值相同的字符串,他们只是值相同,但不是同一个字符串对象,没有指向同一个内存地址
“test”.object_id  #=> 70114101202320
"test".object_id  #=> 70114107991560
2.在一文本中,同一Symbol对象表示的类名,方法名,变量指向同一个Symbol对象
module One 
  class Fred
  end 
  $f1 = :Fred
end

module Two 
  Fred = 1 
  $f2 = :Fred
end

def Fred()
end
$f3 = :Fred

$f1.object_id #=> 2514190
$f2.object_id #=> 2514190
$f3.object_id #=> 2514190
3.对于可变的使用String,不可变的使用Symbol
String有"[]="方法,Symbol没有这个方法,因为它是不可变的。
使用Symbol方法可以降低内存,因为相同名字的Symbol指向的是同一个对象。
4.Symbol新特性
#ruby2.2(不包括2.2)之前,symbol对象一旦被创建,就不会被销毁,下面的代码在ruby2.0中irb执行
Symbol.all_symbols.size #3230
10_000.times{ |t| "t_#{t}".to_sym }
Symbol.all_symbols.size #13230
GC.start #执行垃圾回收
Symbol.all_symbols.size #13230,并没有被垃圾回收

#ruby2.2之后,symbol不会一直占用内存,会被gc回收,下面的代码在ruby2.4中执行
Symbol.all_symbols.size #3235
10_000.times{ |t| "t_#{t}".to_sym }
Symbol.all_symbols.size #4948,在执行的时候已经被gc回收了一部分
GC.start #执行垃圾回收
Symbol.all_symbols.size #3235,全部被gc回收

results matching ""

    No results matching ""