220 likes | 300 Views
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
E N D
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 • 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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