第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Ruby類實例變量與類變量

Ruby類實例變量與類變量

慕尼黑的夜晚無繁華 2019-08-15 15:40:17
Ruby類實例變量與類變量我讀過“ Ruby實例變量什么時候設(shè)置? ”但我在使用類實例變量時有兩種想法。類變量由類的所有對象共享,實例變量屬于一個對象。如果我們有類變量,那么使用類實例變量的余地就不大了。有人可以解釋這兩者之間的區(qū)別以及何時使用它們?這是一個代碼示例:class S  @@k = 23   @s = 15   def self.s    @s   end   def self.k     @@k   endendp S.s #15p S.k #23我現(xiàn)在明白了,Class Instance Variables不會傳遞給繼承鏈!
查看完整描述

3 回答

?
慕慕森

TA貢獻1856條經(jīng)驗 獲得超17個贊


類上的實例變量:


class Parent

  @things = []

  def self.things

    @things

  end

  def things

    self.class.things

  end

end


class Child < Parent

  @things = []

end


Parent.things << :car

Child.things  << :doll

mom = Parent.new

dad = Parent.new


p Parent.things #=> [:car]

p Child.things  #=> [:doll]

p mom.things    #=> [:car]

p dad.things    #=> [:car]

類變量:


class Parent

  @@things = []

  def self.things

    @@things

  end

  def things

    @@things

  end

end


class Child < Parent

end


Parent.things << :car

Child.things  << :doll


p Parent.things #=> [:car,:doll]

p Child.things  #=> [:car,:doll]


mom = Parent.new

dad = Parent.new

son1 = Child.new

son2 = Child.new

daughter = Child.new


[ mom, dad, son1, son2, daughter ].each{ |person| p person.things }

#=> [:car, :doll]

#=> [:car, :doll]

#=> [:car, :doll]

#=> [:car, :doll]

#=> [:car, :doll]

使用類上的實例變量(不在該類的實例上),您可以存儲該類的公共內(nèi)容,而不會自動獲取子類(反之亦然)。使用類變量,您可以方便地不必self.class從實例對象寫入,并且(在需要時)您還可以在整個類層次結(jié)構(gòu)中自動共享。


將這些合并到一個示例中,該示例還包含實例上的實例變量:


class Parent

  @@family_things = []    # Shared between class and subclasses

  @shared_things  = []    # Specific to this class


  def self.family_things

    @@family_things

  end

  def self.shared_things

    @shared_things

  end


  attr_accessor :my_things

  def initialize

    @my_things = []       # Just for me

  end

  def family_things

    self.class.family_things

  end

  def shared_things

    self.class.shared_things

  end

end


class Child < Parent

  @shared_things = []

end

然后在行動:


mama = Parent.new

papa = Parent.new

joey = Child.new

suzy = Child.new


Parent.family_things << :house

papa.family_things   << :vacuum

mama.shared_things   << :car

papa.shared_things   << :blender

papa.my_things       << :quadcopter

joey.my_things       << :bike

suzy.my_things       << :doll

joey.shared_things   << :puzzle

suzy.shared_things   << :blocks


p Parent.family_things #=> [:house, :vacuum]

p Child.family_things  #=> [:house, :vacuum]

p papa.family_things   #=> [:house, :vacuum]

p mama.family_things   #=> [:house, :vacuum]

p joey.family_things   #=> [:house, :vacuum]

p suzy.family_things   #=> [:house, :vacuum]


p Parent.shared_things #=> [:car, :blender]

p papa.shared_things   #=> [:car, :blender]

p mama.shared_things   #=> [:car, :blender]

p Child.shared_things  #=> [:puzzle, :blocks]  

p joey.shared_things   #=> [:puzzle, :blocks]

p suzy.shared_things   #=> [:puzzle, :blocks]


p papa.my_things       #=> [:quadcopter]

p mama.my_things       #=> []

p joey.my_things       #=> [:bike]

p suzy.my_things       #=> [:doll] 


查看完整回答
反對 回復(fù) 2019-08-15
?
拉莫斯之舞

TA貢獻1820條經(jīng)驗 獲得超10個贊

我相信主要(只有?)不同的是繼承:


class T < S

end


p T.k

=> 23


S.k = 24

p T.k

=> 24


p T.s

=> nil

類變量由所有“類實例”(即子類)共享,而類實例變量僅特定于該類。但如果你從不打算擴展你的課程,那么差異純粹是學(xué)術(shù)性的。


查看完整回答
反對 回復(fù) 2019-08-15
  • 3 回答
  • 0 關(guān)注
  • 601 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號