Introduction to Ruby

Download Report

Transcript Introduction to Ruby

CS 480/680 – Comparative Languages
Introduction to Ruby
Object Oriented Programming
 Object: To facilitate implementation
independent sharing of code, by providing wellbehaved units of functional code
• For most languages, this unit is the class
 Specify the behavior of an object, not its
implementation
Intro to Ruby
2
An Example From C++
class SimpleList {
public:
// Insert an integer at the start of the list
virtual bool insertfront(int i) = 0;
// Insert an integer at the end of the list
virtual bool insertend(int i) = 0;
// Get (and delete) the first value in the list
virtual bool getfirst(int &val) = 0;
// Get (and delete) the last value in the list
virtual bool getlast(int &val) = 0;
// Clear the list and free all storage
virtual void clear() = 0;
// Return the number of items in the list
virtual int size() const = 0;
};
Intro to Ruby
3
Encapsulation
 How is the SimpleList implemented?
• An array with dynamic resizing? An STL vector?
A singly-linked list? A doubly-linked list?
 You don’t need to know the implementation of
the class, because it’s behavior has been
specified for you.
 This separation of behavior from
implementation is called encapsulation, and is
the key principle underlying object oriented
programming.
Intro to Ruby
4
Data Abstraction: Motivation
 Focus on the meaning of the operations
(behavior) rather than on the implementation
 User: minimize irrelevant details for clarity
 Implementer
• Restrict users from making false assumptions about
behavior
• Reserve the ability to make changes later to
improve performance
Intro to Ruby
5
Using Classes
 A class is a collection of data and functions
(methods) for accessing the data.
 An object is a specific instance of a class:
SimpleList myList;
class
Intro to Ruby
object
6
Relationships between classes
 Inheritance – used when one class has all the
properties of another class
class Rectangle {
private:
int length, width;
public:
setSize(int newlength, int newwidth) {
length = newlength; width = newwidth;}
};
class coloredRectangle : public Rectangle {
private:
string color;
public:
setColor(string newcolor) {color = newcolor;}
};
Base class members can be inherited or
overridden by the derived class.
Intro to Ruby
7
Relationships between classes (2)
 Composition – one class containing another
class:
class Node {
private:
int value;
// The integer value of this node.
Node* next;
// Pointer to the next node.
public:
Node(int newvalue = 0) {value = newvalue; next = NULL;}
setNext(Node * newnext) {next = newnext;}
};
class linkedList {
private:
Node* head;
public:
linkedList() {head = NULL);
…
};
Intro to Ruby
Can be difficult to decide which
to choose, since composition
will work for any case where
inheritance will work.
8
Polymorphism
 Operators and member functions (methods)
behave differently, depending on what the
parameters are.
 In C++, polymorphism is implemented using
operator overloading
 Should allow transparency for different data
types:
myObject
myObject
myObject
myObject
Intro to Ruby
=
=
=
=
7;
7.0;
”hello world”;
yourObject;
9
Class variables and instance variables
 Most data members are instance variables, each
object gets its own independent copy of the
variables.
 Class variables (and constants) are shared by
every object/instance of the class:
class Student {
private:
static int total_students;
string id, last_name, first_name;
…
}
int Student::total_students = 0;
Intro to Ruby
10
Ruby Basics
 Ruby is probably the most object-oriented
language around
 Every built in type is an object with appropriate
methods:
"gin joint".length
"Rick".index("c")
-1942.abs
sam.play(aSong)
Intro to Ruby
9
2
 1942
 "duh dum, da dum…"
11
Ruby Terminology
 Class/instance – the usual definitions
• Instance variables – again, what you would expect
• Instance methods – have access to instance
variables
 Methods are invoked by sending messages to an
object
• The object is called the receiver
 All subroutines/functions are methods
• Global methods belong to the Kernel object
Intro to Ruby
12
Code Structure
 No semicolons. One statement per line.
• Use \ for line continuation
 Methods are defined using the keyword def:
def sayGoodnight(name)
result = "Goodnight, " + name
return result
end
# Time for bed...
puts sayGoodnight("John-Boy")
puts sayGoodnight("Mary-Ellen")
Intro to Ruby
13
Code Structure (2)
 Parens around method arguments are optional
• Generally included for clarity
• These are all equivalent:
puts sayGoodnight "John-Boy"
puts sayGoodnight("John-Boy")
puts(sayGoodnight "John-Boy")
puts(sayGoodnight("John-Boy"))
Intro to Ruby
14
String Interpolation
 Double quoted strings are interpolated
 Single quoted strings are not
name = ”John Kerry”
puts(”Say goodnight, #{name}\n”)
 Say goodnight John Kerry
puts(’Say goodnight, #{name}\n’)
 Say goodnight, #{name}\n
Intro to Ruby
15
Variable Typing and Scope
 Variables are untyped:
var = 7;
var *= 2.3;
var = ”hello world”;
 First character indicates scope and some metatype information:
• Lower case letter (or _) – local variable, method
parameter, or method name
• $ – global variables
• @ – instance variables
• @@ – class variables
• Upper case letter – Class name, module name, const
Intro to Ruby
16
Scope
 Local variables only survive until the end of the
current block
while (var > 0)
newvar = var * 2; // newvar created
…
end
// now newvar is gone!
Intro to Ruby
17
Ruby Operators
 See operators.rb
Intro to Ruby
18
Ruby Collections
 Collections are special variables that can hold
more than one object
• Collections can hold a mix of object types
 Arrays – standard 0-based indexing
• Must be explicitly created
a = []
a = Array.new
a = [1, ’cat’, 3]
puts a[2]  3
Intro to Ruby
19
Collections (2)
 Hash – like an array, but the index can be nonnumeric
• Created with {}’s
• Access like arrays: []
student = {
’name’ => ’John Doe’,
’ID’ => ’123-45-6789’,
’year’ => ’sophomore’,
’age’ => 26
}
puts student[’ID’]  123-45-6789
Intro to Ruby
20
Collections (3)
 Hashes and Arrays return the special value nil
when you access a non-existent element
 When you create a hash, you can specify a
different default value:
myhash = Hash.new(0)
 This hash will return 0 when you access a non-existent member
 We’ll see a lot more methods for arrays and
hashes later
Intro to Ruby
21
Hashes can be a very powerful tool
 Suppose you wanted to read a file and…
• List all of the unique words in the file in
alphabetical order
• List how many times each word is used
 The answer is a hash
words = Hash.new(0)
while (line = gets)
words[line] += 1
end
words.each {|key, value|
print "#{key} ==> #{value}\n"
}
Intro to Ruby
22
Control Structures
 The basics (if, while, until, for) are all there:
if (count > 10)
puts "Try again“
elsif tries == 3
puts "You lose“
else
puts "Enter a number“
end
while (weight < 100 and numPallets <= 30)
pallet = nextPallet()
weight += pallet.weight
numPallets += 1
end
Intro to Ruby
23
Statement Modifiers
 Single statement loops can be written efficiently
with control modifiers:
square = square*square
sum = sum * -1
Intro to Ruby
while square < 1000
if sum < 0
24
Reading and Writing
 A key strength of interpreted languages is the
ability to process text files very quickly
• I/O in Ruby (and Perl and Python) is extremely easy
printf "Number: %5.2f, String: %s", 1.23, "hello“
 Number: 1.23, String: hello
while gets
if /Ruby/
print
end
end
We’ll talk more
about regular
expressions later.
ARGF.each { |line|
Intro to Ruby
print line
Blocks and
iterators are very
powerful in Ruby.
More on this later,
too.
if line =~ /Ruby/ }
25
Basic File I/O
 Open a file by creating a
new File object:
infile = File.new(“name”, “mode”)
String Mode
Start Pos.
“r”
Read
Beginning
“r+”
Read/Write
Beginning
“w”
Write
Truncate/New
“w+”
Read/Write
Truncate/New
“a”
Write
End/New
“a+”
Read/Write
End/New
infile = File.new(“testfile”, “r”)
while (line = infile.gets)
line.chomp!
# do something with line
end
infile.close
Intro to Ruby
26
Exercises
 Write a Ruby program that:
• Reads a file and echoes it to standard out, removing
any lines that start with #

Try also accounting for leading whitespace
• Reads a file and prints the lines in reverse order
• Reads a list of student records (name, ssn, grade1,
grade2, grade3,…) and stores them in a hash.

Intro to Ruby
Report min, max, and average grade on each assignment
27