Ruby Programming: A Deep Dive into Scripting Languages with a Focus on Ruby, Study notes of Programming Languages

An overview of ruby programming, including its uses, applications, and unique features. It covers topics such as books on ruby, applications of scripting languages, output from command-line tools, climate data, raw census data, and the ruby language itself. Students will learn about the benefits of using ruby, how to run ruby programs, and various control statements. Ideal for university students studying computer science or programming, particularly those interested in scripting languages and ruby.

Typology: Study notes

Pre 2010

Uploaded on 02/13/2009

koofers-user-vef
koofers-user-vef 🇺🇸

10 documents

1 / 9

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
1
CMSC 330: Organization of
Programming Languages
Introduction to Ruby
CMSC 330 2
Last lecture
Many types of programming languages
Imperative, functional, logical, OO, scripting
Many programming language attributes
Clear, orthogonal, natural…
Programming language implementation
Compiled, interpreted
CMSC 330 3
Introduction
Ruby is an object-oriented, imperative scripting
language
“I wanted a scripting language that was more powerful than
Perl, and more object-oriented than Python. That's why I
decided to design my own language.”
“I believe people want to express themselves when they
program. They don't want to fight with the language.
Programming languages must feel natural to programmers. I
tried to make people enjoy programming and concentrate on the
fun and creative part of programming when they use Ruby.”
Yukihiro Matsumoto (“Matz”)
CMSC 330 4
Books on Ruby
Earlier version of Thomas book available on web
¾See course web page
CMSC 330 5
Applications of Scripting Languages
Scripting languages have many uses
Automating system administration
Automating user tasks
Quick-and-dirty development
Major application
Text processing
CMSC 330 6
Output from Command-Line Tool
% wc *
271 674 5323 AST.c
100 392 3219 AST.h
117 1459 238788 AST.o
1874 5428 47461 AST_defs.c
1375 6307 53667 AST_defs.h
371 884 9483 AST_parent.c
810 2328 24589 AST_print.c
640 3070 33530 AST_types.h
285 846 7081 AST_utils.c
59 274 2154 AST_utils.h
50 400 28756 AST_utils.o
866 2757 25873 Makefile
270 725 5578 Makefile.am
866 2743 27320 Makefile.in
38 175 1154 alloca.c
2035 4516 47721 aloctypes.c
86 350 3286 aloctypes.h
104 1051 66848 aloctypes.o
...
pf3
pf4
pf5
pf8
pf9

Partial preview of the text

Download Ruby Programming: A Deep Dive into Scripting Languages with a Focus on Ruby and more Study notes Programming Languages in PDF only on Docsity!

CMSC 330: Organization of

Programming Languages

Introduction to Ruby

CMSC 330 2

Last lecture

Many types of programming languages

  • Imperative, functional, logical, OO, scripting

Many programming language attributes

  • Clear, orthogonal, natural…

Programming language implementation

  • Compiled, interpreted

CMSC 330 3

Introduction

Ruby is an object-oriented, imperative scripting

language

  • “I wanted a scripting language that was more powerful than Perl, and more object-oriented than Python. That's why I decided to design my own language.”
  • “I believe people want to express themselves when they program. They don't want to fight with the language. Programming languages must feel natural to programmers. I tried to make people enjoy programming and concentrate on the fun and creative part of programming when they use Ruby.” - Yukihiro Matsumoto (“Matz”) CMSC 330 4

Books on Ruby

  • Earlier version of Thomas book available on web ¾ See course web page

CMSC 330 5

Applications of Scripting Languages

Scripting languages have many uses

  • Automating system administration
  • Automating user tasks
  • Quick-and-dirty development

Major application

Text processing

CMSC 330 6

Output from Command-Line Tool

% wc * 271 674 5323 AST.c 100 392 3219 AST.h 117 1459 238788 AST.o 1874 5428 47461 AST_defs.c 1375 6307 53667 AST_defs.h 371 884 9483 AST_parent.c 810 2328 24589 AST_print.c 640 3070 33530 AST_types.h 285 846 7081 AST_utils.c 59 274 2154 AST_utils.h 50 400 28756 AST_utils.o 866 2757 25873 Makefile 270 725 5578 Makefile.am 866 2743 27320 Makefile.in 38 175 1154 alloca.c 2035 4516 47721 aloctypes.c 86 350 3286 aloctypes.h 104 1051 66848 aloctypes.o ...

CMSC 330 7

Climate Data for IAD in August, 2005

================================================================================ 1 2 3 4 5 6A 6B 7 8 9 10 11 12 13 14 15 16 17 18 AVG MX 2MIN DY MAX MIN AVG DEP HDD CDD WTR SNW DPTH SPD SPD DIR MIN PSBL S-S WX SPD DR ================================================================================

1 87 66 77 1 0 12 0.00 0.0 0 2.5 9 200 M M 7 18 12 210 2 92 67 80 4 0 15 0.00 0.0 0 3.5 10 10 M M 3 18 17 320 3 93 69 81 5 0 16 0.00 0.0 0 4.1 13 360 M M 2 18 17 360 4 95 69 82 6 0 17 0.00 0.0 0 3.6 9 310 M M 3 18 12 290 5 94 73 84 8 0 19 0.00 0.0 0 5.9 18 10 M M 3 18 25 360 6 89 70 80 4 0 15 0.02 0.0 0 5.3 20 200 M M 6 138 23 210 7 89 69 79 3 0 14 0.00 0.0 0 3.6 14 200 M M 7 1 16 210 8 86 70 78 3 0 13 0.74 0.0 0 4.4 17 150 M M 10 18 23 150 9 76 70 73 -2 0 8 0.19 0.0 0 4.1 9 90 M M 9 18 13 90 10 87 71 79 4 0 14 0.00 0.0 0 2.3 8 260 M M 8 1 10 210 ...

CMSC 330 8

Raw Census 2000 Data for DC

u108_S,DC,000,01,0000001,572059,72264,572059,12.6,572059,572059,572059,0,0, 0,0,572059,175306,343213,2006,14762,383,21728,14661,572059,527044, 7,340061,1560,14605,291,1638,10272,45015,16689,3152,446,157,92,20090, 89,572059,268827,3362,3048,3170,3241,3504,3286,3270,3475,3939,3647, ,3044,2928,2913,2769,2752,2933,2703,4056,5501,5217,4969,13555,24995, 16,23726,20721,18802,16523,12318,4345,5810,3423,4690,7105,5739,3260, 7,303232,3329,3057,2935,3429,3326,3456,3257,3754,3192,3523,3336,3276, 89,2838,2824,2624,2807,2871,4941,6588,5625,5563,17177,27475,24377, ,21319,20851,19117,15260,5066,6708,4257,6117,10741,9427,6807,6175, 9,536373,370675,115963,55603,60360,57949,129440,122518,3754,3168,22448, 9967,4638,14110,16160,165698,61049,47694,13355,71578,60875,10703,33071, 35686,7573,28113,248590,108569,47694,60875,140021,115963,58050,21654, 396,57913,10355,4065,6290,47558,25229,22329,24058,13355,10703,70088, 37,37112,21742,12267,9475,9723,2573,2314,760,28625,8207,7469,738,19185, 18172,1013,1233,4351,3610,741,248590,199456,94221,46274,21443,24831, 47,8705,3979,4726,39242,25175,14067,105235,82928,22307,49134,21742, 6,211,11565,9966,1650,86,1564,8316,54,8262,27392,25641,1751,248590, 63,4999,22466,26165,24062,16529,12409,7594,1739,132627,11670,32445, 5,21661,16234,12795,10563,4034,248590,115963,48738,28914,19259,10312, 48,3992,132627,108569,19284,2713,1209,509,218, ...

CMSC 330 9

A Simple Example

Let’s start with a simple Ruby program

# This is a ruby program x = 37 y = x + 5 print(y) print("\n")

ruby1.rb:

% ruby -w ruby1.rb 42 %

CMSC 330 10

Language Basics

# This is a ruby program x = 37 y = x + 5 print(y) print("\n")

comments begin with #, go to end of line

variables need not be declared

line break separates expressions (can also use “;” to be safe)

no special main() function or method

CMSC 330 11

Run Ruby, Run

There are three ways to run a Ruby program

  • ruby -w filename – execute script in filename ¾ tip: the -w will cause Ruby to print a bit more if something bad happens
  • irb – launch interactive Ruby shell ¾ can type in Ruby programs one line at a time, and watch as each line is executed irb(main):001:0> 3+ => 7 irb(main):002:0> print("hello\n") hello => nil

CMSC 330 12

Run Ruby, Run (cont.)

Suppose you want to run a Ruby script as if it

were an executable

¾ ./filename # run program

  • The first line (“shebang”) tells the system where to find the program to interpret this text file
  • Must chmod u+x filename first ¾ Or chmod a+x filename so everyone has exec permission
  • Warning: Not very portable ¾ Depends on location /usr/local/bin/ruby

#!/usr/local/bin/ruby -w print("Hello, world!\n")

CMSC 330 19

Yet More Control Statements in Ruby

unless cond then stmt-f else stmt-t end

  • Same as “if not cond then stmt-t else stmt-f end”

until cond body end

  • Same as “while not cond body end” until i >= n puts message i = i + 1 end

unless grade < 90 then puts "You got an A" else unless grade < 80 then puts "You got a B" end end

CMSC 330 20

Using If and Unless as Modifiers

Can write if and unless after an expression

  • puts "You got an A" if grade >= 90
  • puts "You got an A" unless grade < 90

Why so many control statements?

  • Is this a good idea?
  • Advantages? Disadvantages?

CMSC 330 21

Other Useful Control Statements

case x when 1, 3.. when 2, 6.. end

while i>n

break

next

puts message

redo

end

for i in (1..3)

puts i

end

for elt in [1, “math”, 3.4]

puts elt.to_s

end

(1..3).each {

|elt|

puts elt

IO.foreach(filename)

|x|

puts x

generates a string (cf. to_i)

code block does not need 'break' (^) CMSC 330 22

Using Ruby Control Statements

Ruby function to print all even numbers

from 1 to some given value x

def even(x) for i in (1..x) if i % 2 == 0 puts i end end end

def even(x) (1..x).each{ |i| if i % 2 == 0 puts i end } end

CMSC 330 23

Classes and Objects

Class names begin with an uppercase letter

The “new” method creates an object

  • s = String.new creates a new String and makes s refer to it

Every class inherits from Object

CMSC 330 24

Everything is an Object

In Ruby, everything is in fact an object

  • (-4).abs ¾ integers are instances of Fixnum
  • 3 + 4 ¾ infix notation for “invoke the + method of 3 on argument 4”
  • "programming".length ¾ strings are instances of String
  • String.new ¾ classes are objects with a new method
  • (4.13).class ¾ use the class method to get the class for an object ¾ floating point numbers are instances of Float

CMSC 330 25

Objects and Classes

Objects are data Classes are types (the kind of data which things are) But in Ruby, classes themselves are objects!

Fixnum, Float, String, etc., (including Class), are objects of type Class

Object Class

String Class

Fixnum Class

String.new String

"CMSC 330" String

-3.30 Float

10 Fixnum

CMSC 330 26

Two Cool Things to Do with Classes

Since classes are objects, you can manipulate

them however you like

  • if p then x = String else x = Time end # Time is … # another class y = x.new # creates a String or a Time,

depending upon p

You can get names of all the methods of a class

  • Object.methods ¾ => ["send", "name", "class_eval", "object_id", "new", "autoload?", "singleton_methods", ... ]

CMSC 330 27

The nil Object

Ruby uses a special object nil

  • All uninitialized fields set to nil (@ refers to a class field) irb(main):004:0> @x => nil
  • Like NULL or 0 in C/C++ and null in Java

nil is an object of class NilClass

  • It’s a singleton object – there is only one instance of it ¾ NilClass does not have a new method
  • nil has methods like to_s, but not other methods that don’t make sense irb(main):006:0> @x + 2 NoMethodError: undefined method `+' for nil:NilClass CMSC 330 28

What is a Program?

In C/C++, a program is...

  • A collection of declarations and definitions
  • With a distinguished function definition ¾ int main(int argc, char *argv[]) { ... }
  • When you run a C/C++ program, it’s like the OS calls main(...)

In Java, a program is...

  • A collection of class definitions
  • With a class MyClass that contains a method ¾ public static void main(String[] args)
  • When you run java MyClass, the main method of class MyClass is invoked

CMSC 330 29

A Ruby Program is...

The class Object

  • When the class is loaded, any expressions not in method bodies are executed def sayN(message, n) i = 0 while i < n puts message i = i + 1 end return i end

x = sayN("hello", 3) puts(x)

defines a method of Object

invokes self.sayN

invokes self.puts (part of Object)

CMSC 330 30

Ruby is Dynamically Typed

Recall we don’t declare types of variables

  • But Ruby does keep track of types at run time x = 3; x.foo NoMethodError: undefined method 'foo' for 3:Fixnum

We say that Ruby is dynamically typed

  • Types are determined and checked at run time

Compare to C, which is statically typed

**# Ruby x = 3 x = "foo" # gives x a

new type**

/ C / int x; x = 3; x = "foo"; / not allowed /

CMSC 330 37

super( ) in Ruby

Within the body of a method

  • Call to super( ) acts just like a call to that original method
  • Except that search for method body starts in the superclass of the object that was found to contain the original method

CMSC 330 38

Global Variables in Ruby

Ruby has two kinds of global variables

  • Class variables beginning with @@ (static in Java)
  • Global variables across classes beginning with $ class Global @@x = 0

def Global.inc @@x = @@x + 1; $x = $x + 1 end

def Global.get return @@x end end

$x = 0 Global.inc $x = $x + 1 Global.inc puts(Global.get) puts($x)

define a class (“singleton”) method

CMSC 330 39

Special Global Variables

Ruby has a bunch of global variables that are

implicitly set by methods

The most insidious one: $_

  • Default method return, argument in many cases

Example

Using $_ leads to shorter programs

  • And confusion
  • It's suggested you avoid using it

gets # implicitly reads input into $_ print # implicitly writes $_

CMSC 330 40

Creating Strings in Ruby

Substitution in double-quoted strings with #{ }

  • course = "330"; msg = "Welcome to #{course}"
  • "It is now #{Time.new}"
  • The contents of #{ } may be an arbitrary expression
  • Can also use single-quote as delimiter ¾ No expression substitution, fewer escaping characters

Here-documents

s = < for elt in [100,-9.6,"pickle"] | puts "#{elt}\t(#{elt.class})" | end 100 (Fixnum) -9.6 (Float) pickle (String)**

CMSC 330 42

Creating Strings in Ruby (cont.)

Ruby also has printf and sprintf

  • printf("Hello, %s\n", name);
  • sprintf("%d: %s", count, Time.now) ¾ Returns a string

The to_s method returns a String representation

of a class object

CMSC 330 43

Standard Library: String

The String class has many useful methods

  • s.length # length of string
  • s1 == s2 # structural equality (string contents)
  • s = "A line\n"; s.chomp # returns "A line" ¾ Return new string with s's contents except newline at end of line removed
  • s = "A line\n"; s.chomp! ¾ Destructively removes newline from s ¾ Convention: methods ending in! modify the object ¾ Another convention: methods ending in? observe the object
  • "r1\tr2\t\tr4".each("\t") { |rec| puts rec } ¾ Apply code block to each tab-separated substring CMSC 330 44

Standard Library: String (cont.)

  • "hello".index("l", 0) ¾ Return index of the first occurrence of string in s, starting at n
  • "hello".sub("h", "j") ¾ Replace first occurrence of "h" by "j" in string ¾ Use gsub ("global" sub) to replace all occurrences
  • "r1\tr2\t\tr3".split("\t") ¾ Return array of substrings delimited by tab

Consider these three examples again

  • All involve searching in a string for a certain pattern
  • What if we want to find more complicated patterns? ¾ Find first occurrence of "a" or "b" ¾ Split string at tabs, spaces, and newlines

Regular Expressions!

CMSC 330 45

Object Copy vs. Reference Copy

Consider the following code

  • Assume an object/reference model like Java or Ruby ¾ Or even two pointers pointing to the same structure

Which of these occur?

Object copy Reference copy

x = "groundhog" ; y = x

x "groundhog" (reference) (object)

y "groundhog"

x (reference) "groundhog" (object) y

CMSC 330 46

Object Copy vs. Reference Copy (cont.)

For

  • Ruby and Java would both do a reference copy

But for

  • Ruby would cause an object copy
  • Unnecessary in Java since Strings are final

x = "groundhog" y = String.new(x)

x = "groundhog" ; y = x

CMSC 330 47

Physical vs. Structural Equality

Consider these cases again:

If we compare x and y, what is compared?

  • The references, or the contents of the objects they point to?

If references are compared (physical equality)

the first would return false but the second true

If objects are compared both would return true

x "groundhog" (reference) (object)

y "groundhog"

x (reference) "groundhog" (object) y

CMSC 330 48

String Equality

In Java, x == y is physical equality, always

  • Compares references, not string contents

In Ruby, x == y for strings uses structural equality

  • Compares contents, not references
  • == is a method that can be overridden in Ruby!
  • To check physical equality, use the equal? method ¾ Inherited from the Object class

It’s always important to know whether you’re

doing a reference or object copy

  • And physical or structural comparison