男人眼淚中的Ruby(三)

來源:互聯網
上載者:User

今天原本平穩的心情被一些事情所觸動,深埋的東西被拔起的感覺總是痛痛的,不提太多了,還是專心寫文章吧。說說今天這篇文章的關鍵字,看看有沒有你能有用的: Class Hierarchies ,Accessors,Attributes,Class Variables。說白了今天就是Deep in Ruby Class了,不過這個 Deep 不夠 Deep,只是在我個人的膚淺之上的Deep。

仔細說說,看完了Ruby的文法書,發現了ruby居然沒有提供介面這個文法,而是用一個Module來取代了,這也就是說Ruby沒有實現多繼承,也就是只能有一個父類,然後可以有多個子類。Only one SuperClass and many Subclass。下面看看Ruby類面類繼承的文法:

class Man  def initialize(aName,aAge)    @name=aName    @age=aAge  end  def get_name    return @name  end  def get_age    return @age  end  def to_s    return 'Good!!!'  endendclass SuperMan<Man  def initialize(aName,aAge,aPower)    super(aName,aAge)    @power=aPower  end  def get_power    return @power  end  def set_power    return @power  endendsupermanABC=SuperMan.new('Jesse',21,100)puts (supermanABC.get_power)puts(supermanABC.inspect)

 

這個裡面我們可以看到從類繼承的文法就是一個<符號,很簡潔。看了代碼總是很清晰,只需要點一下就是那個super()訪問超類,也就是subclass 調用superclass的建構函式了。 

我們在寫ruby的class的屬性的時候如果總是寫get_power和set_power這樣的函數,對這個屬性操作的時候還都是要class.get_power之類感覺很麻煩,我們能不能把它整成直接這樣訪問 class.power=x,那樣不是很爽啊。下面看看代碼,瞭解一下ruby的accessor方法:

class SuperMan<Man  def initialize(aName,aAge,aPower)    super(aName,aAge)    @power=aPower  end  def power    return @power  end  def power=(aPower)    @power=aPower  endendsupermanABC=SuperMan.new('Jesse',21,100)supermanABC.power=98puts (supermanABC.power)puts(supermanABC.inspect)

 

改造了一下上面的SuperMan類,然後定義了power的accessor,很明顯文法,不用抽出來講了。不過感覺對於每個屬性如果還是這樣寫的話也是比較麻煩,繼續簡化,整出下一個主角 Attribute Reader和Writer標籤。看看下面的代碼:

class SuperMan<Man  attr_reader:power  attr_writer:power    def initialize(aName,aAge,aPower)    super(aName,aAge)    @power=aPower  endend

 

更加簡化了吧,其實還可以更加簡化,繼續給出代碼:

class SuperMan<Man    attr_accessor:power  def initialize(aName,aAge,aPower)    super(aName,aAge)    @power=aPower  endend

 

一個標籤就搞定了,其實個人比較推薦上面的attr_reader和attr_writer,因為你可以用def power這種方法的從在方便的對屬性進行處理後在返回,看看下面的代碼你就有所體會了:

class Man  attr_writer:name  def initialize(aName,aAge)    @name=aName    @age=aAge  end  def name    return @name.capitalize  endendsuperman=Man.new("jesse",21)puts(superman.name)

 

這裡的@name.capitalize是把這個屬性值的首字母大寫了輸出。感覺這樣更靈活一些,在靈活和方便的找到了一個折中。下面來說說Class Variables,這個是在所有的類的執行個體之間共用的一個變數。下面看看代碼:

class Man  attr_writer:name  @@man_name=0  def initialize(aName,aAge)    @name=aName    @age=aAge    @@man_name+=1  end  def name    return @name.capitalize  end  def get_man_name    return @@man_name  endendsuperman=Man.new("jesse",21)superman1=Man.new("jesse1",22)superman2=Man.new("jesse2",22)puts superman.get_man_nameputs superman1.get_man_nameputs superman2.get_man_name

 

class variables的文法為@@varname。程式運行輸出的結果都是3,這就說明他們之間是共用的。這個東西在有些地方很有用,大家多考慮考慮。

今天就寫到這裡吧。明天講講 hash 和 array 的內容。順便說一下我們宿舍的小八也戀愛了,祝福他們。呵呵,不知道怎麼搞得,心裡突然很失落。也許我的愛情觀改變了...

PS: 今天看完了《A little book of Ruby》 和 《Ruby on rails:up and running》這兩本書,大強度的英語閱讀下感覺慢慢的還是可以習慣英文閱讀的。今天做個決定,以後技術書籍只要有英文版本盡量去看英文版。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.