ruby - रूबी कक्षा चर




class inheritance (4)

@ खेल के उत्तर को विपरीत करने के लिए, यह क्लास ऑब्जेक्ट्स पर इंस्टेंस चर का उपयोग करता है:

class Fish
  # an instance variable of this Class object
  @var = 'fish'

  # the "getter"
  def self.v
    @var
  end

  # the "setter"
  def self.v=(a_fish)
    @var = a_fish
  end
end

class Trout < Fish
  self.v = 'trout'
end

class Salmon < Fish
  self.v = 'salmon'
end

p Trout.v   # => "trout"
p Salmon.v  # => "salmon"

संपादित करें: कक्षा के आवृत्ति परिवर्तनीय को पढ़ने के लिए उदाहरण देने के लिए:

class Fish
  def type_of_fish
    self.class.v
  end
end

p Trout.new.type_of_fish   # => "trout"
p Salmon.new.type_of_fish  # => "salmon"

रूबी क्लास-इंस्टेंस सामान मुझे सिरदर्द दे रहा है। मैं समझ गया यह ...

class Foo
  @var = 'bar'
end

... कि @var बनाए गए वर्ग के उदाहरण पर एक चर है।

लेकिन मैं एक उप-वर्ग अतिरंजित वर्ग चर कैसे बना सकता हूं?

पाइथन में मैं क्या करूँगा इसका एक उदाहरण यहां दिया गया है:

class Fish:
var = 'fish'
def v(self):
    return self.var

class Trout(Fish):
    var = 'trout'

class Salmon(Fish):
    var = 'salmon'

print Trout().v()
print Salmon().v()

कौन सा आउटपुट:

trout
salmon

मैं रूबी में एक ही चीज़ कैसे करूं?


एक समस्या है: आप @var ओवरराइड कर सकते हैं:
Salmon.var = 'शार्क' @var ओवरराइड होगा, तो
रखता है (Salmon.new) .v # => शार्क


होबोडेव के लिंक का उपयोग करके पता लगाया गया संस्करण यहां दिया गया है:

class Fish
  class << self
    attr_accessor :var
  end

  @var = 'fish'
  def v
    self.class.var
  end
end

class Trout < Fish
  @var = 'trout'
end

class Salmon < Fish
  @var = 'salmon'
end

puts (Trout.new).v   # => trout
puts (Salmon.new).v  # => salmon

ध्यान दें कि subclassing केवल @var जोड़ने की आवश्यकता है - प्रारंभ करने के लिए ओवरराइड करने की कोई आवश्यकता नहीं है।


@var वर्णित @var को क्लास इंस्टेंस वैरिएबल कहा जाता है, जो इंस्टेंस चर से अलग है ... diff देखने के लिए here जवाब पढ़ें।

वैसे भी यह बराबर रूबी कोड है:

class Fish
  def initialize
    @var = 'fish'
  end

  def v
    @var
  end
end

class Trout < Fish
  def initialize
    @var = 'trout' 
  end
end

class Salmon < Fish
  def initialize
    @var = 'salmon' 
  end
end

puts Trout.new.v
puts Salmon.new.v




class-variables