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

Preview:

Citation preview

Ruby Objects, Classes and VariablesRuby Objects, Classes and Variables

CS 480/680 – Comparative LanguagesCS 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

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

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)"

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

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...]"

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

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

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)

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

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

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

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

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

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

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.

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

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

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…

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

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

Recommended