最近一直在看Programming Ruby - 2nd, 先記錄下一些不熟悉的Ruby的基本語法和操作(熟悉的就不再記啦...)
Ruby的命名:
??????局部變量?????????全局變量??????實例變量??????類變量??? ?????????常量和類名
==============================================================================
??????name????????????$debug?????? @name??????? @@total?????????? PI
??????fish_and_chips? $CUSTOMER??? @point_1???? @@symtab????????? FeetPerMile
??????x_axis????????? $_?????????? @X?????????? @@N?????????????? String??????
??????thx1138???????? $plan9 ????? @_???????????@@x_pos?????????? MyClass
??????_26???????????? $Global????? @plan9?????? @@SINGLE??????????JazzSong
==============================================================================
數組:
數組下標從0開始, 下標可以為負整數, 此時代表數組從最末端開始, 最末端索引從-1開始
數組的元素可以是任何類型的對象實例,包括nil實例
數組的初始化:
a = [ 'ant', 'bee', 'cat', 'dog', 'elk' ]
或者
a = %w{ ant bee cat dog elk }
訪問:
a[0]????#返回"ant"
a[1]????#返回"bee"?
a[-1]???#返回"elk"
a[-2]???#返回"dog"
賦值:
a = [ 1, 3, 5, 7, 9 ]
a[1] = 'bat'???????#a = [1, "bat", 5, 7, 9]
a[3]= 'cat'??????? #a = [1, "bat", "cat", 7, 9]
a[3] = [ 9, 8 ]????#a = [1, "bat", "cat", [9, 8], 9]
a[6] = 99??????????#a = [1, "bat", "cat", [9, 8], 9, nil, 99]
a = [ 1, 3, 5, 7, 9 ]
a[2, 2] = 'cat'???????????#a = [1, 3, "cat", 9]
a[2, 0] = 'dog'???????????#a = [1, 3, "dog", "cat", 9]
a[1, 1] = [ 9, 8, 7 ]?????#a = [1, 9, 8, 7, "dog", "cat", 9]
a[0..3] = [ ]?????????????#a = ["dog", "cat", 9]
a[5..6] = 99, 98??????????#a = ["dog", "cat", 9, nil, nil, 99, 98]
哈希表:
相當于Java中的Map
具有"鍵值對"特性, key和value都可以是任何類型的實例
哈希的初始化:
h = Hash["a", 100, "b", 200]???? # {"a"=>100, "b"=>200}
h = Hash["a" => 100, "b" => 200]?# {"a"=>100, "b"=>200}
h = { "a" => 100, "b" => 200 }?? # {"a"=>100, "b"=>200}
訪問:
h.length = 2
賦值:
h = { 'dog' => 'canine', 'cat' => 'feline', 'donkey' => 'asinine' }
h.length????# 3
h['dog']??? # "canine"
h['cow']????# 'bovine'
h[12]?????? #?'dodecine'
h['cat'] = 99
h?????????? #?{"cow"=>"bovine", "cat"=>99, 12=>"dodecine","donkey"=>"asinine", "dog"=>"canine"}
代碼塊:
代碼塊在ruby 中是以{} 和do end 來包圍起來的。通常如果是單行使用{} ,如果是多行使用do..end
代碼塊可以接受參數, 參數用兩個豎線"|"符號來包含, 參數間用逗號","來分隔
代碼塊被作為一個對象傳入method體中執行(如果代碼塊對象有參數, 則method體在執行代碼塊中的代碼前,需要對代碼塊對象的參數賦值)
例如:
def test(max)
???i1, i2 = 1, 1??????????# parallel assignment (i1 = 1 and i2 = 1)
???while i1 <= max
??????yield i1????????????# 也可以寫成yield(i1),?yield指令代表了代碼塊執行的位置, i1是method體中對代碼塊f進行了賦值
??????i1, i2 = i2, i1+i2
???end
end
test(1000) {|f| print f, " " }
輸出: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
又例如:
[1,3,5,7].inject(0) {|sum, element| sum+element} # 輸出:16
Method的聲明:
一般格式是:
???def my_new_method(arg1, arg2, arg3)????# 3 arguments
??????# Code for the method would go here
???end
方法名initialize是特殊的method, 它在類的new操作時被執行, 用于對類實例進行初始化操作:
???def initialize(name, &block)
??????@name, @block = name, block
???end
如果需要方法返回一個值, 可以顯式使用return關鍵字, 也可以使用"默認最后一行返回值"形式:
???def meth_one
??????"one"????# 相當于 return "one"
???end
如果method的聲明中最后的參數帶有"&"前綴(例如下例的&action), 則表示該參數接受的是代碼塊, 并且該代碼塊將被轉換為Proc對象, 最后被賦值給一個類實例變量,如:
???class JukeboxButton < Button
??????def initialize(label, &action)
?????????super(label)
?????????@action = action #代碼塊對象被賦值給一個類實例變量(即@action)
??????end
??????def button_pressed
?????????@action.call(self)
??????end
???end
???start_button = JukeboxButton.new("Start") { songlist.start }
如果method的聲明中最后的參數帶有"*"前綴, 表示該參數接受的是0個或多個參數(即:可變長參數), 例如:
???def varargs(arg1, *rest)
??????"Got #{arg1} and #{rest.join(', ')}"
???end
???varargs("one")????????????????# "Got one and "
???varargs("one", "two")???????? # "Got one and two"
???varargs "one", "two", "three" # "Got one and two, three"
如果method的方法名最后為字符"=", 表示該方法可為類實例變量賦值, 相當于Java中的setXXXX方法
???class Song
??????def duration=(new_duration)?? # 整個方法名為"duration="
?????????@duration = new_duration?? # @duration為類實例變量
??????end
???end
???song = Song.new("Bicylops", "Fleck", 260)
???song.duration???????# 260
???song.duration = 257 # set attribute with updated value
???song.duration???????#?257
???上例中的"duration="方法 相當于下面的: attr_writer :duration
???class Song
??????attr_writer :duration
???end
???song = Song.new("Bicylops", "Fleck", 260)
???song.duration = 257
區間:
兩個點創建一個"包含"區間
1..10????#包含1和10
'a'..'z'
三個點創建一個除最后一個元素外的區間
my_array = [ 1, 2, 3 ]
0...my_array.length? # 相當于0..2
區間可以通過to_a函數來轉換為數組
a = (1..3).to_a?? # a = [1, 2, 3]
區間的一些方法:
digits = 0..9
digits.include?(5)???????????????????# true
digits === 5?????? ??????????????????# true
digits.min???????????????????????????# 0
digits.max???????????????????????????# 9
digits.reject {|i| i < 5 }???????????#?[5, 6, 7, 8, 9]
digits.each {|digit| dial(digit)}??? #? 0..9
待續...