(一)Ruby中一切都是對象,包括一個常數.
比如可以用.class屬性來查看一個對象的類型,你可以看下1.class,會發現常數1的類型是Fixnum,1不過是Fixnum的一個執行個體。還可以使用-37這個Fixnum的執行個體方法abs來取得絕對值:-37.abs()會返回37
又如輸入一個1.1.class,會返回Float。
(二)Ruby文法
Ruby中的類以class開始 以end結束,類名首字母的約定是大寫。
Ruby中的方法以def開始 以end結束,方法名首字母的約定是小寫。
Ruby中的局部變數名首字母的約定是小寫。
Ruby中的建構函式名稱為initialize。
Ruby中的成員變數(執行個體變數)前置@符,在initialize裡進行聲明與初始化。
Ruby中的屬性用attr_writer和attr_reader聲明,分別對應c#的set,get,使用了attr_accessor是可讀也可寫
Ruby中的全域變數前置$符。
Ruby中的常數(常量)用大寫字母開頭,約定是全部大寫。
Ruby中任何的運算式都會傳回值,sample
class Rectangle
def initialize(wdth, hgt)
@width = wdth
@height = hgt
end
def width=(wdth)
@width = wdth
end
end
r = Rectangle.new(2,3)
puts r.width = 5 #output 5
puts r.width # error! because the width not support read
繼續補充下attr_accessor的使用,sample
class Rectangle
attr_accessor :width
attr_accessor :height
attr_accessor :width2
attr_accessor :height2
def initialize(wdth, hgt)
@width = wdth
@height = hgt
end
def area()
return @width * @height
end
def area2()
return @width2 * @height2
end
end
r = Rectangle.new(2,3)
r.width = 5 # give samename's variable value
r.height = 5
puts r.area() #outputs is 25
r.width2 = 6 # not samename's variable create
r.height2 = 6
puts r.area2() # outputs is 36
上面的代碼說明了,在使用attr_accessor的時候,會尋找是否有同名的成員變數,如果有則訪問同名成員變數,如果沒有會預設建立一個前置@的成員變數
(三)神奇的操作符重載
Ruby支援操作符重載,而且很神奇!
class Rectangle
attr_accessor :width
attr_accessor :height
def initialize(wdth, hgt)
@width = wdth
@height = hgt
end
def area()
return @width * @height
end
def +(addRectangle)
return self.area + addRectangle.area
end
end
r1 = Rectangle.new(2,2)
r2 = Rectangle.new(3,3)
puts r1+r2 # operator override
puts r1+(r2)
puts r1.+(r2) # standard function calling format
神奇吧,其實把+號理解為一個函數的名字最好不過了,就像最後一個寫法,哈哈。
(四)參數的傳遞
參數的傳遞中有預設值與可變長參數兩個比較有特點的地方,其他語言有的,ruby也有。
1.參數的預設值
預設值的設定很簡單,與其他語言一樣,sample
class Rectangle
attr_accessor :width
attr_accessor :height
def initialize(wdth = 2, hgt = 2)
@width = wdth
@height = hgt
end
def area()
return @width * @height
end
end
r1 = Rectangle.new
puts r1.area
看到了吧,使用預設值了
2.選擇性參數,可變長參數 sample
class ParamSample
def sayHello(*names)
puts names.class
puts "Hello #{names.join(",")}!"
end
end
ps = ParamSample.new
ps.sayHello #output Array Hello !
ps.sayHello("lee","snake") #output Array Hello lee,snake!
可以看出,可變長參數首碼*號,可變長參數的實質是一個Array,呵呵。