class Point VERSION = 2 @@num = 12 attr_accessor :x, :y def initialize(x, y) @x, @y = x, y end # 1 返回布爾值的方法末位必定要加上? # 2 此處的x 與 y 是self.x 的省略寫法, 由於有get 方法因此才能夠這麼寫 # 固然也能夠@x @y 這樣的寫法 def first_quadrant? x > 0 && y > 0 end # 3 可是在給局部變量賦值的時候必定不能簡寫成 x += def plus(a, b) self.x += a @y += b end # 4 符號方法 # 5 會自動將最後處理出來的結果return出去 此處省略return # 6 此處的x 和 y 就是省略了self.x 或者@x 這種寫法 def +(p2) Point.new(@x + p2.x, @y + p2.y) end # 7 此處x 前面不能加self 此處的self指的是類 def self.second_quadrant?(x , y) x < 0 && y > 0 # self指代的是類 # print self.xxxx end # 8 類方法能夠合併成多個寫法 class << self def foo2 end def bar2 end end end # 9 實例沒法調用類方法 # 10 類也沒法直接調用實例方法 class Point # 9 經過類直接調用全局變量 須要給類加一個方法 # 10 在ruby中能夠直接打開類增長你須要的東西 def self.get_num @@num end end # 11 調用常量 # Point::VERSION # 12 繼承 class Point3D < Point # 13 super調用父類的同名方法 def initialize(x, y, z) super(x, y) @z = z end end class Point2D < Point # 14 super若是不寫參數的話 默認傳入全部的參數給super def initialize(x, y) super end end # 15 在Ruby中子類能夠繼承父類的全部方法 無論是private protected public # 在Ruby子類能夠重寫如 父類的private 方法但不建議這麼作 # 繼承最好使用protected 和 public 方法 class Point def prv_method print 'this is private method' end private :prv_method def pro_metod print 'this is protected method' end protected :pro_metod def wat prv_method pro_metod end def wut # 16 private 方法和 protected最大的區別 private方法不能使用實例調用 # 只能隱式調用 因此self.prv_method 方法是錯誤的 # self.prv_method self.pro_metod end end # 17 is_a? 和 instance_of 的區別 p3 = Point3D.new(1, 2, 3) # 18 is_a? 只要是這個類的實例或者是子類的實例均可 p p3.is_a?(Point) p p3.instance_of?(Point3D) # 19 instance_of? 只能是這個類的實例才能夠 p p3.instance_of?(Point) p p3.instance_of?(Point3D) # 20 = - p3等於上個計算式的結果 # p1 = Point(2, 3) # p2 = Point(3, 4) # p1 + p2 # p3 = -