a = %w( ant bee cat dog elk ) # create an arraya.each # iterate over the contents
5.times::雙冒號3.upto(6)
('a'..'e').each
域作用符,將模組(類)與它的常量隔開
類重複定義,只是增加方法
在 ruby 中 symbol 表示「名字」,比如字串的名字,識別符號的名字,建立乙個 symbol 物件的方法是在名字或者字串前面加上冒號
:在 ruby 中每乙個物件都有唯一的物件識別符號(object identifier
),可以通過object_id 方法來得到乙個物件的識別符號。例子如下:
irb(main):
001:
0> puts :foo.object_id
2327458
3irb(main):
002:
0> puts :foo.object_id
4327458
5irb(main):
003:
0> puts :
"foo
".object_id
6327458
7irb(main):
004:
0> puts
"foo
".object_id
824303850
9irb(main):
005:
0> puts
"foo
".object_id
1024300010
11irb(main):
006:
0> puts
"foo
".object_id
1224296170
前三行語句中的 :foo (或者 :"foo")都是同乙個 symbol 物件,其 object id 為327458,而後三行中的字串」foo」都是不同的物件,其 object id 依次為24303850、24300010、24296170。
可見,每個 string 物件都是不同的,即便他們包含了相同的字串內容;而對於 symbol 物件,乙個名字(字串內容)唯一確定乙個 symbol 物件
(symbol 物件的字串中不能含有』\0』字元)。
除了可以採用一般的字串,還可以使用操作符(例如+, -, *, /),變數,常量,方法甚至類的名字來建立 symbol 物件,例如:+就是乙個合法的 symbol 。實際上,在 ruby 內部操作符、變數等名字本身就是作為 symbol 處理的,例如當你定義乙個例項變數時, ruby 會自動建立乙個 symbol 物件,例如 @test 對應為 :@test 。
1例項變數的 symbol23
class
test
4attr_accessor :test
5end
symbol 和 string
symbol 物件和 string 物件是完全不同的東西,物件識別符號很明確的說明了這一點。
symbol 轉化為 string
使用 to_s 或 id2name 方法將 symbol 轉化為乙個 string 物件:
?
1
2
3
4
5
6
irb(main):
001
:
0
>
:test
.id2name
=>
"test"
irb(main):
002
:
0
>
:test
.to_s
=>
"test"
irb(main):
003
:
0
> :
"i am a boy"
.to_s
=>
"i am a boy"
注意,每個 string 物件都是唯一的,因此對乙個 symbol 呼叫多次將產生多個 string 物件。
string 轉化為 symbol
除了在字串前面加冒號,還可以使用 to_sym 或 intern 方法將 string 轉化為 symbol ,如果該 symbol 已經存在,則直接返回。
irb(main):
001:
0>
var1 ="
test
".to_sym
2=>
:test
3irb(main):
002:
0>
var2 ="
test
".intern
4=>
:test
5irb(main):
003:
0>
var1
==var2
6=>
true
7irb(main):
004:
0>
使用 symbol
那麼 symbol 對我們有什麼用呢?當然也是記憶體。使用 string 的開銷太大了,因為每乙個string 都是乙個物件。想想前邊的例子,乙個字串每出現一次 ruby 就會建立乙個 string 物件。
通常來講,當你面臨 string 還是 symbol 的選擇時,可以參考以下標準:
那麼什麼時候我們會用到名字呢?很多時候都會,比如列舉值、關鍵字(雜湊表關鍵字、方法的引數)等等
作為雜湊表的 key
雜湊表是 symbol 應用最為廣泛的地方。在ruby中,雜湊和陣列類似,乙個雜湊表是一系列 key/value 對的集合,只不過它的 key 取值範圍更廣泛,可以是任何物件,比如正規表示式。
但通常我們都會取有意義的 key ,比如 string、symbol 。
下面這個雜湊表表示按城市分類的一些機器的集合:
hosts
如果要引用 beijing 的機器,使用 hosts['beijing'] 。但如果我們程式中要頻繁引用雜湊表中 value ,這樣就不大好了,因為 ruby 對每一次字串引用都會生成乙個 string 物件,
累積下來這個開銷是相當大的,我們可以
使用 symbol 作為 key:
?
1
hosts =
通常我們定義的函式的引數的個數和順序是寫死的,呼叫函式的時候要確保引數的個數、順序匹配,有時候這樣很不方便,使用雜湊引數可以解決這個問題。
Ruby基本語法
一 ruby中一切都是物件 比如可以用.class屬性來檢視乙個物件的型別,看下1.class,會發現常數1的型別是fixnum,1是fixnum的乙個例項。二 ruby語法 ruby中的類以class開始 以end結束,類名首字母的約定是大寫 ruby中的方法以def開始 以end結束,方法名首字...
Ruby基本語法
一 ruby中一切都是物件 比如可以用.class屬性來檢視乙個物件的型別,看下1.class,會發現常數1的型別是fixnum,1是fixnum的乙個例項。二 ruby語法 ruby中的類以class開始 以end結束,類名首字母的約定是大寫 ruby中的方法以def開始 以end結束,方法名首字...
Ruby語法了解
三 流程控制 1 條件控制 if 條件表示式 operation1 elsif operation2 else operation3 end unless 條件表示式 operation2 else operation1 end 與if流程相反 2 分支控制 case 表示式 when 值1,值2 ...