Ruby 學習筆記 Symbol

2021-06-01 20:40:22 字數 2935 閱讀 6698

ruby 學習筆記 

symbol

symbol 在

ruby

中是由乙個標示符前面加乙個冒號(:)組成的。從程式設計師的角度說它不是字串,不是變數,不是常量,他僅是個名字,它的值是它自己。從直譯器的角度說,它是乙個指向乙個

symbol table

的指標,這個

symbol table

是乙個ruby

內部所有識別符號組成的列表。

symbol

是唯一的。兩個內容相同的字串

"string"

和"string"

在ruby

中有不同的

object_id 

,但是:string

和:string

有同乙個

object_id。

例如下面的**:

puts( :helloworld.equal?( :helloworld ) )    #=> true 

puts( "helloworld".equal?( "helloworld" ) )  #=> false 

puts( 1.equal?( 1 ) )        #=> true 

symbol可以作為引數傳給乙個方法,也可以用在

case

語句中。

symbol的唯一性,不會因變數的可見性而改變。看下面的例子:

module one 

class fred 

end 

$f1 = :fred 

end 

module two 

fred = 1 

$f2 = :fred 

end 

def fred() 

end 

$f3 = :fred 

這個例子中有三個全域性變數$f1,$f2,$f3

被賦值相同的

symbol 

:fred

,雖然在各自的可見區內有不同的含義,但是三個全域性變數確實有相同的

object_id。

乙個更全面的例子:

module one 

class fred 

end 

$f1 = :fred 

def self.evalfred( asymbol ) 

puts( eval( asymbol.id2name ) )    

end 

end 

module two 

fred = 1 

$f2 = :fred 

def self.evalfred( asymbol ) 

puts( eval( asymbol.id2name ) )       

end 

end 

def fred() 

puts( "hello from the fred method" ) 

end 

$f3 = :fred 

one::evalfred( $f1 )     #=> displays the module::class name: one::fred  

two::evalfred( $f2 )      #=> displays the fred constant value: 1 

method($f3).call         #=> calls fred method: displays: 

#            「

hello from the fred method」 

上面的例子,把三個相同的symbol

傳給三個不同的方法,得到的實際結果是:

symbol

保留了他們在原可見區內含義。

上面的例子中同樣注意到有兩個方法:eval

和id2name

。id2name

和symbol

類的乙個方法,它返回乙個

symbol

的名字或乙個與

symbol

it  returns  the  name  or  string  corresponding  to  the  symbol 

)。to_s

方法可以做相同的事情。

eval

是乙個核心級的方法,它能計算字串中表示式的值。看下面的例子:

x=2puts(eval(:x.to_s)) #輸出2

puts(eval(:x.id2name))  #輸出2

:x.id2name會返回x,而

eval

計算出x

的值是2

取得乙個方法的symbol

,然後把

symbol

傳給乙個叫

method

的方法,再呼叫乙個叫

call

的特殊方法,如下面的形式:

method(:amethod).call("") 

我們可以用上面的形式呼叫乙個方法。

繼續看下面的例子:

def amethod(val)

puts("i say "this_is_a_method_name=method(:amethod)

puts(this_is_a_method_name)

puts( "#")

this_is_a_method_name.call("hello ")

method(:amethod)返回乙個

method

類的物件,所以

puts(this_is_a_method_name)

就輸出#

,puts( "#")

輸出method

。此時呼叫

this_is_a_method_name.call("hello ")

就相當於呼叫了

amethod("hello")

(學習資料是ruby安裝程式中的book of ruby)

js學習筆記(symbol)

let smb symbol let smb2 symbol console.log smb smb2 false symbol資料型別是不重複的,也不相等 類似於唯一的字串 let smb symbol symbol資料的描述 console.log smb.description symbol資...

ruby 學習筆記

usr bin ruby puts ruby 資料型別 puts ruby支援的資料型別包括基本的number string ranges symbols,以及true false和nil這幾個特殊值,同時還有兩種重要的資料結構 array和hash。puts n array n ary liqia...

ES6 11學習筆記 Symbol

symbol 一種新的原始資料型別 宣告方式 let s1 symbol let s2 symbol console.log s1 symbol console.log s2 symbol console.log s1 s2 false let s3 symbol foo let s4 symbol...