溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ruby編程API閱讀之Class類

發(fā)布時(shí)間:2020-06-18 05:29:04 來(lái)源:網(wǎng)絡(luò) 閱讀:563 作者:wqyzsh 欄目:編程語(yǔ)言

    在Ruby中,所有的class都是對(duì)象,是Class這個(gè)類的實(shí)例。

    一、 類是對(duì)象

    當(dāng)我們編寫一個(gè)新的class的時(shí)候(一般情況下使用class Name ... end ),我們實(shí)際上生成了一個(gè)Class類的對(duì)象同事將其賦予了一個(gè)全局變量(在這里Name就是這個(gè)全局變量)。當(dāng)我們調(diào)用Name.new來(lái)創(chuàng)建一個(gè)新的對(duì)象的時(shí)候,我們默認(rèn)地調(diào)用了Class中的new方法。我們可以通過(guò)覆寫Class類中的new方法來(lái)證明這一點(diǎn):

class Class
   alias oldNew  new
   def new(*args)  
      print "Creating a new ", self.name, "\n"
      oldNew(*args) 
   end
 end

 class Name
 end

 n = Name.new

    執(zhí)行這段代碼會(huì)產(chǎn)生這樣的輸出: Creating a new Name

    二、Class.new do .... end

 fred = Class.new do
  def meth2
    "hello"
  end
  def meth3
    "bye"
  end
 end
  a = fred.new     #=> #<#<Class:0x100381890>:0x100376b98>
  a.meth2          #=> "hello"
  a.meth3          #=> "bye"

   上面代碼中的block實(shí)現(xiàn)了跨越ruby作用域門的作用。實(shí)際上是對(duì)Class類的覆寫,不過(guò)顯得更加ruby way。至于這樣的做有什么大用處,我還沒(méi)想通,還需要在以后的源代碼閱讀中認(rèn)真體會(huì)。

  三、 私有方法inherited

class Foo
   def self.inherited(subclass)
         puts "New subclass: #{subclass}"
   end
end
class Bar < Foo
end
class Baz < Bar
end

 上面這段代碼會(huì)產(chǎn)生下面的輸出:

    New subclass: Bar

    New subclass:  Baz

 這應(yīng)該也算是ruby元編程的一點(diǎn)點(diǎn)內(nèi)容吧,類似于included,當(dāng)Foo類被繼承的時(shí)候,子類會(huì)自動(dòng)的向這個(gè)私有方法傳遞子類類名并且執(zhí)行該方法內(nèi)的代碼。也應(yīng)該用處。之前在Rails源代碼中遇見(jiàn)過(guò)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI