" aSong.to_s »"# "  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.to_s »"# "  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">

Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages."— Presentation transcript:

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

2 Ruby Classes2  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

3 Ruby Classes3 Using the Class aSong = Song.new("Bicylops", "Fleck", 260) aSong.inspect »"#<Song:0x401b299c @artist=\"Fleck\", @name=\"Bicylops\", @duration=260>" aSong.to_s »"# "  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

4 Ruby Classes4 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)"

5 Ruby Classes5 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

6 Ruby Classes6 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 aSong = KaraokeSong.new("My Way", "Sinatra", 225, "And now...") aSong.to_s » "Song: My Way--Sinatra (225) [And now...]"

7 Ruby Classes7 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

8 Ruby Classes8 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

9 Ruby Classes9 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 # (NoMethodError)

10 Ruby Classes10 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 aSong = Song.new("Bicylops", "Fleck", 260) aSong.durationInMinutes » 4.333333333 aSong.durationInMinutes = 4.2 aSong.duration » 252

11 Ruby Classes11 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 @@

12 Ruby Classes12 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

13 Ruby Classes13 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

14 Ruby Classes14 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

15 Ruby Classes15 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

16 Ruby Classes16 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 Logger.create.id » 537762894 Makes the new() method private Use Logger.create() instead.

17 Ruby Classes17 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 class Shape def Shape.triangle(sideLength) Shape.new(3, sideLength*3) end def Shape.square(sideLength) Shape.new(4, sideLength*4) end

18 Ruby Classes18 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

19 Ruby Classes19 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…

20 Ruby Classes20 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 balance() is available to any Account object

21 Ruby Classes21 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


Download ppt "Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages."

Similar presentations


Ads by Google