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

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

Embed Size (px)

Citation preview

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

Ruby Objects, Classes and VariablesRuby Objects, Classes and Variables

CS 480/680 – Comparative LanguagesCS 480/680 – Comparative Languages

Page 2: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 2

Ruby ClassesRuby 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   endend

Page 3: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 3

Using the ClassUsing the Class

aSong = Song.new("Bicylops", "Fleck", 260)aSong.inspect

»"#<Song:0x401b299c @artist=\"Fleck\",@name=\"Bicylops\", @duration=260>"

aSong.to_s»"#<Song:0x401b2a14>"

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

Page 4: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 4

Overriding the SuperclassOverriding 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})“   endEnd

aSong = Song.new("Bicylops", "Fleck", 260)aSong.to_s

»"Song: Bicylops--Fleck (260)"

Page 5: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 5

InheritanceInheritance

“< 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 endend

Page 6: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 6

Calling the SuperclassCalling 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...]"

Page 7: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 7

Accessing Data MembersAccessing Data Membersclass 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

Page 8: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 8

Writing Data MembersWriting Data Membersclass Song attr_writer :durationend

Is the same as this:class Song def duration=(newDuration) # Methods ending @duration = newDuration # in “=“ are end # specialend

aSong = Song.new("Bicylops", "Fleck", 260) aSong.duration » 260 aSong.duration = 257aSong.duration » 257

Page 9: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 9

Class state is protectedClass state is protected In Ruby, you can only access data members

(“state”) of a class through class methodsclass Myclass def initialize() @state1 = 0 @state2 = 1 end

attr_reader(:state1, :state2)end

myobj = Myclass.newputs myobj.state1, myobj.state2

myobj.state1 = 7

objectstate.rb:13: undefined method `state1=' for #<Myclass:0x402b0ed0 @state2=1, @state1=0> (NoMethodError)

Page 10: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 10

Virtual Data MembersVirtual 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

Page 11: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 11

Class VariablesClass 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 @@

Page 12: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 12

Class VariablesClass Variablesclass 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." endend

Page 13: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 13

Class MethodsClass 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.methodNameclass Example def instMeth # instance method end def Example.classMeth # class method endend

Page 14: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 14

Class ConstantsClass 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

Page 15: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 15

Variables in RubyVariables 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

Page 16: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 16

SingletonsSingletons 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 singletonclass Logger private_class_method :new @@logger = nil def Logger.create @@logger = new unless @@logger @@logger endend

Logger.create.id » 537762894 Logger.create.id » 537762894

Makes the new() method private

Use Logger.create() instead.

Page 17: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 17

Alternative constructorsAlternative constructors New calls initialize() with the same parameters

passed to itself. You can call new from other methods:

class Shape def initialize(numSides, perimeter) # ... endendclass Shape def Shape.triangle(sideLength) Shape.new(3, sideLength*3) end def Shape.square(sideLength) Shape.new(4, sideLength*4) endend

Page 18: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 18

Access ControlAccess Control Access control to methods is C++-likeclass 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' #... endend

Page 19: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 19

Alternate notation for access controlAlternate 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 :method3end

This is the notation for a Ruby symbol. We’ll discuss symbols in more detail later…

Page 20: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 20

Method AccessMethod 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 objectsclass Account attr_reader :balance

protected :balance

def greaterBalanceThan(other) return @balance > other.balance endend

balance() is available to any Account object

Page 21: Ruby Objects, Classes and Variables CS 480/680 – Comparative Languages

Ruby Classes 21

ExercisesExercises 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