ruby 類和模組

2021-07-02 04:29:33 字數 4407 閱讀 5484

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提供四種型別的變數 區域性變數 區域性變數是在方法中定義的變數。區域性變數在方法...