1 / 21

Ruby Objects, Classes and Variables

CS 480/680 – Comparative Languages. Ruby Objects, Classes and Variables. Ruby Classes. Remember, in Ruby variables are created automatically the first time they are accessed

neo
Download Presentation

Ruby Objects, Classes and Variables

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CS 480/680 – Comparative Languages Ruby Objects, Classes and Variables

  2. Ruby Classes • Remember, in Ruby variables are created automatically the first time they are accessed • Thus, there is no variable declaration section in a Ruby class, variables are created in the initialize method (the equivalent of a C++ constructor) class Song   def initialize(name, artist, duration)     @name     = name     @artist   = artist     @duration = duration   end end Ruby Classes

  3. Using the Class • How can we call to_s and inspect, when we have not defined them for this class? • Answer: All classes are subclasses of class Object • to_s and inspect are inherited from Object aSong = Song.new("Bicylops", "Fleck", 260) aSong.inspect »"#<Song:0x401b299c @artist=\"Fleck\", @name=\"Bicylops\", @duration=260>" aSong.to_s »"#<Song:0x401b2a14>" Ruby Classes

  4. Overriding the Superclass • Classes can be reopened any time • Which means that you can override or extend built-in classes just by opening them • Notice the missing return() in to_s class Song   def to_s     "Song: #{@name}--#{@artist} (#{@duration})“   end End aSong = Song.new("Bicylops", "Fleck", 260) aSong.to_s »"Song: Bicylops--Fleck (260)" Ruby Classes

  5. Inheritance • “< Song” – indicates that KaraokeSong is a subclass of Song. All methods of Song are included in KaraokeSong • Data members are not explicitly included, but the are created by the call to super in initialize class KaraokeSong < Song def initialize(name, artist, duration, lyrics) super(name, artist, duration) @lyrics = lyrics end end Ruby Classes

  6. Calling the Superclass • Calling super with no arguments calls the same-named method in the superclass with the same arguments class KaraokeSong < Song # Format ourselves as a string by appending # our lyrics to our parent's #to_s value. def to_s super + " [#{@lyrics}]" end end aSong = KaraokeSong.new("My Way", "Sinatra", 225, "And now...") aSong.to_s » "Song: My Way--Sinatra (225) [And now...]" Ruby Classes

  7. Accessing Data Members class Song attr_reader :name, :artist, :duration end Is the same as this: class Song def name @name end def artist @artist end def duration @duration end end Ruby Classes

  8. Writing Data Members class Song attr_writer :duration end Is the same as this: class Song def duration=(newDuration) # Methods ending @duration = newDuration # in “=“ are end # special end aSong = Song.new("Bicylops", "Fleck", 260) aSong.duration » 260 aSong.duration = 257 aSong.duration » 257 Ruby Classes

  9. Class state is protected • In Ruby, you can only access data members (“state”) of a class through class methods class Myclass def initialize() @state1 = 0 @state2 = 1 end attr_reader(:state1, :state2) end myobj = Myclass.new puts myobj.state1, myobj.state2 myobj.state1 = 7 objectstate.rb:13: undefined method `state1=' for #<Myclass:0x402b0ed0 @state2=1, @state1=0> (NoMethodError) Ruby Classes

  10. Virtual Data Members • When using access methods, data can be converted before reporting, so data members can be accessed in multiple ways: class Song def durationInMinutes @duration/60.0 # force floating point end def durationInMinutes=(value) @duration = (value*60).to_i end end aSong = Song.new("Bicylops", "Fleck", 260) aSong.durationInMinutes » 4.333333333 aSong.durationInMinutes = 4.2 aSong.duration » 252 Ruby Classes

  11. Class Variables • Class variables store data stored among all instances of a class • There is only one class variable storage location for the entire class • Must be initialized before use in the class definition • Class variables start with @@ Ruby Classes

  12. Class Variables class Song @@plays = 0 # Play count for ALL songs def initialize(name, artist, duration) @name = name @artist = artist @duration = duration @plays = 0 # Play count for THIS song end def play @plays += 1 @@plays += 1 "This song: #@plays plays. Total #@@plays plays." end end Ruby Classes

  13. Class Methods • Some methods need to be run without being attached to any particular instance • Example: Test if a file is readable • Can’t open the file if it is not readable • File.readable?(“Filename”) might be defined to allow this test without any particular file variable • Defined as Classname.methodName class Example def instMeth # instance method end def Example.classMeth # class method end end Ruby Classes

  14. Class Constants • Recall that constants begin with uppercase letters • Constants defined outside of any class are global, while those defined within a class are local: class SongList MaxTime = 5*60 # 5 minutes def SongList.isTooLong(aSong) return aSong.duration > MaxTime end end Ruby Classes

  15. Variables in Ruby • Variables in Ruby hold references to objects! • A reference is basically an address with some class/type information • This can make assignment somewhat tricky! • See variables.rb Ruby Classes

  16. Singletons • Suppose you want only one object of a particular class, and every time a new instance is “created” it refers to the same object? • This is a design pattern called a singleton class Logger private_class_method :new @@logger = nil def Logger.create @@logger = new unless @@logger @@logger end end Logger.create.id » 537762894 Logger.create.id » 537762894 Makes the new() method private Use Logger.create() instead. Ruby Classes

  17. Alternative constructors • New calls initialize() with the same parameters passed to itself. • You can call new from other methods: class Shape def initialize(numSides, perimeter) # ... end end class Shape def Shape.triangle(sideLength) Shape.new(3, sideLength*3) end def Shape.square(sideLength) Shape.new(4, sideLength*4) end end Ruby Classes

  18. Access Control • Access control to methods is C++-like class MyClass def method1 # default is 'public' #... end protected # subsequent methods will be 'protected' def method2 # will be 'protected' #... end private # subsequent methods will be 'private' def method3 # will be 'private' #... end public # subsequent methods will be 'public' def method4 # and this will be 'public' #... end end Ruby Classes

  19. Alternate notation for access control • Alternately, you can do it this way: class MyClass def method1 end # ... and so on public :method1, :method4 protected :method2 private :method3 end This is the notation for a Ruby symbol. We’ll discuss symbols in more detail later… Ruby Classes

  20. Method Access • Public – available to anyone • Private – only available to other methods of this class called on the same object • Protected – available only to other methods of this class for this and other objects class Account attr_reader :balance protected :balance def greaterBalanceThan(other) return @balance > other.balance end end balance() is available to any Account object Ruby Classes

  21. Exercises • Create a Ruby class for Students • Name, SSN, midterm, final, array of lab scores, array of hw scores • Constructor, attr_readers and attr_writers • Virtual attributes exam_avg, lab_avg (read-only) • Class variable: student_count • Read 5 or 10 student records from a file into an array of student objects, then print them Ruby Classes

More Related