1、所有的類名必須以大寫字母開頭,self關鍵字表示定義的類
類例項:
[ruby]view plain
copy
class point
attr_accessor :x, :y
include enumerable
def initialize(x = 0, y = 0)
@x = x
@y = y
end#這裡並沒有做型別檢查,但是可以自行定義型別檢驗
def +(other)
raise typeerror, "point argument expected"
unless other.is_a? point
point.new(@x + other.x, @y + other.y)
end#定義-方法,point中的點取反
def -@
point.new(-@x,-@y)
end#定義*方法
def *(scalar)
point.new(@x * scalar , @y * scalar)
enddef (index)
case index
when 0, -2
@xwhen 1, -1
@ywhen
:x, "x"
then
@xwhen
:y, "y"
then
@yelse
nilend
end#為point類定義了乙個迭代器,好像該類像個陣列一樣
#一旦定義的迭代器,就可以混入enumrable模組的一些方法,這些方法都是基於each定義的
defeach
yield
@xyield
@yend
#point的相等性
def ==(o)
if o.is_a? point #if o is a point object
@x == o.x && @y == o.y #then compare the fields
elsif
false
endend
alias eql? ==
def eql(o)
if o.instance_of? point
@x.eql?(o.x) && @y.eql?(o.y)
elsif
false
endend
include comparable
#根據到原點的距離比較兩個點的大小,需要include comparable module
def<=>(other)
return
nilunless other.instance_of? point
@x ** 2 + @y ** 2 <=> other.x **2 + other.y ** 2
enddef to_s
"#,#"
endend
p = point.new(3,4)
puts p # => 3,4
p1 = p+p
puts p1 # => 6,8
p2 = p*3
puts p2 # => 9,12
p3 = -p
puts p3 # => -3,-4
puts p["x"] #=> 3
p.each #=>34
puts
#is the point p at the original ?
puts p.all? # => fasle 呼叫enumerable中定義的方法,基於each方法
pp = point.new(3,4)
puts pp==p #=>true 判斷相等性
puts pp.eql(p) #=>true
p4 = point.new(4,4)
p5 = point.new(5,5)
puts p4#=> true
2、類方法的使用
可用point.sum定義類方法,也可使用self.sum定義類方法。
[ruby]view plain
copy
class point
attr_accessor :x,:y
def initialize(x=0,y=0)
@x , @y = x,y
end#定義乙個類方法
def point.sum(*point)
x = 0
y = 0
point.each
do |p|
x += p.x
y += p.y
endpoint.new(x,y)
enddef to_s
"#,#"
endend
p1 = point.new(1,2)
p2 = point.new(1,2)
p3 = point.new(1,2)
p = point.sum(p1,p2,p3)
puts p #=> 3,6
3、繼承
[ruby]view plain
copy
class abstractgreeter
def greet
puts "# #"
endend
class concretegreeter < abstractgreeter
def greeting
"hello"
enddef words
"world"
endend
concretegreeter = concretegreeter.new
concretegreeter.greet #=> hello world
4、類變數的繼承
如果子類在乙個已在超類中使用的類變數賦值,它不會建立這個類變數的私有拷貝,而是直接修改父類看到的那個類變數,同時所有其他字列也會看到這個被修改的值。
[ruby]view plain
copy
class a
@@value = 1
def a.value
@@value
endend
class b < a
@@value = 2
endclass c < a
@@value = 3
endputs a.value #=>3
5、工廠方法建立類
[ruby]view plain
copy
class point
def initialize(x=0,y=0)
@x , @y = x, y
end#make the factory method new private
private_class_method :new
#factory method for cartesian coordinates
def point.cartesian(x,y)
new(x,y)
end#factory method for polar coordinates
def point.polar(r,theta)
new(r*math.cos(theta),r*math.sin(theta))
enddef to_s
"# #"
endend
p = point.cartesian(1,2)
puts p
6、單例方法
[ruby]view plain
copy
require 'singleton'
class pointstates
include singleton
def initialize
@n , @totalx, @totaly = 0, 0.0, 0.0
endend
p = pointstates.instance
p2 = pointstates.instance
puts p==p2 #=> true
Ruby 1 9 3 類和模組
module instance methods,private instance methods,public instance methods 在1.9中返回乙個由symbol構成的陣列,而不是string陣列 class x def foo end end x.instance methods ...
Ruby 1 9概要(3)類和模組
三 類和模組 1 module instance methods,private instance methods,public instance methods module這三個方法都將返回方法名 的symbol組成的陣列,而非過去的字串陣列。2 module const defined?con...
Ruby 類和物件
ruby是一種物件導向程式設計語言,具有物件導向的特性 封裝 抽象 繼承和多型性。在ruby中,類以關鍵字class開始,後面跟類名 應大寫 以end結束。例如 class customer end1.2 變數 ruby提供四種型別的變數 區域性變數 區域性變數是在方法中定義的變數。區域性變數在方法...