SlideShare a Scribd company logo
1 of 45
Download to read offline
Introduction to Ruby
Nicola Calcavecchia - 19/04/2013
calcavecchia@{elet.polimi.it|gmail.com}
Principles of Programming Languages
1
Main Features
• Dynamically Typed.
• Purely Object Oriented.
• Supports Meta-Programming.
• Garbage collected.
• Supports inheritance and mixins.
www.ruby-lang.org
2
History
• Created byYukihiro Matsumoto (Matz) in 1995.
• Influenced by Smalltalk, Perl, Lisp and Python
• Current stable release: 2.0.0-p0
• Interpreters:
• MRI (Matz’s Ruby Interpreter)
• YARV (now official)
• Others: JRuby, Rubinius, IronRuby
3
Diffusion
• Killer apps:
• Ruby on Rails (web framework)
• Puppet, Chef (configuration management)
• Capistrano (deploy management utility)
• and many others...
Source: https://github.com/languages (5/04/2013)
4
Getting started
• irb executable: interactive shell (i.e., REPL).
• ruby executable: language interpreter.
• File extensions: .rb
ruby hello.rb
5
Hello World
(and a glimpse at Ruby Syntax)
print("Hello World");
print("Hello World")
• Semicolons are optional:
• Practically never used.
• Use newline instead.
• Classic (and verbose)
• Parenthesis in methods are optional:
• Cleaner syntax!
• Works well for DSLs (will see later...).
print "Hello World"
Cool, but pay attention:
f(3+2) + 1
f (3+2) + 1
6
Data Types
• Ruby has many built-in data types:
• Numeric: Integer, Floats, Complex, Rational, etc.
• String: single-quoted, doubly-quoted, here documents,
backtick, characters, etc.
• Array
• Hash
• Boolean and nil
• etc.
7
Data Types
• Ruby has many built-in data types:
• Numeric: Integer, Floats, Complex, Rational, etc.
• String: single-quoted, doubly-quoted, here documents,
backtick, characters, etc.
• Array
• Hash
• Boolean and nil
• etc.
All are implemented
by objects!
7
Numeric Types
• Implemented as objects
•All inherits from Numeric class
404 # Fixnum
1_000_000_000 # Better readability
241.1 # Float
-3.7e4 # Float
0xFF # Fixnum given in hex
1 + 1.0 # Float
8
Strings
• Enclosed in single or double quotes
• Small differences between the two
• String interpolation
• Unicode escapes
• Mutable objects
"six times four is: #{6*4}"
=> "six times four is: 24"
"this is a string"
=> "this is a string"
'this is a string too'
=> "this is a string too"
"u20ac"
=> "€"
9
Arrays
• Dynamically sized
• Untyped and mutable
• Example:
[1, 2, 3] # an array with three Fixnum objects
[] #empty array
[0] * 10 # new array containing 10 zeros
["a string", 42, 3.3, []] # can hold any type of object
a = [1, 1, 2, 3, 5, 8]
a[0] # first element is 1
a[-1] # last element is 8
a[10] # nil if exceeding limits
a[7] = 21 # extends the array (with nil)
a[2,3] # subarray starting from 2, 3 elements long
a[2,3] = ['A','B','C'] #substitute subarray
a + [0, -1] # concatenates two arrays
[1, 2, 3, 4, 5] - [2, 4] # removes elements from the first array
10
Hashes
• Unordered collection of key-value pairs
• Mutable
• Indexed by keys
a = {} # create an empty hash
a['one'] = 1 # map string 'one' to Fixnum 1
a['two'] = 2# map string 'two' to Fixnum 1
a = {'one' => 1, 'two' => 2} # create and initialize Hash
a['one']
=> 1
11
Symbols
• Same as scheme symbols
• Constant, immutable strings
• I.e., placeholder for identifiers and strings
• Always prefixed by a semicolon
• Created in memory as soon as referenced
:red # create a new symbol called red
"blue".to_sym # convert a string to a symbol
=> :blue
:"red" # same as :red
hash = {:red => "red", :blue => "blue" } # often used in hashes
(i.e., fast)
12
Boolean and Nil
• true: logical true value
• Singleton instance of TrueClass
• false: logical false value
• Singleton instance of FalseClass
• nil: null value (i.e., absence of value)
• Singleton instance of NilClass
13
Rules for objects
1. All variables are references to objects (there are no
primitive types!)
2. Objects communicate via messages (i.e., method calls)
3. Each object has its own (private) state
4. Every object is an instance of a class
14
Object References
• It always works with references to object (i.e., similar
to Scheme, Java)
• Call by object sharing:
• When an object is passed to a method, its reference
is passed (i.e., the reference is copied).
s = "Ruby" # Creates a String object. Store the reference to it in s
t = s # Copy reference to t
t[-1] = "" # Modify the object through reference to t
print s # Access (modified) object through s
t = "Java" # t now refers to a different object
print s,t # Prints "RubJava"
15
Classes and methods
• class keyword to define a class
• def to define methods
class ClassName
" def method1(par1, par2)
" " expression1
" end
" def method2(par1, par2)
" " expression2
" end
end
16
Constructor and instance
variables
• Method initialize is the constructor
• Instance variables start with @ symbol
class Point
" def initialize(x,y)
" " @x = x
" " @y = y
" end
" def to_s()
" " return "#{@x},#{@y}"
" end
end
17
Cleaner version...
• Ruby supports “parallel assignments”
• Return is implicit (i.e., like Scheme):
• Last expression is returned if not specified
class Point
" def initialize(x,y)
" " @x, @y = x, y
" end
" def to_s()
" " "#{@x},#{@y}"
" end
end
Instance variables are
created only when stored
for the first time
18
Creating an object
• Invoke constructor with new
p = Point.new(10,20)
• Invoking a method:
print p.to_s
• Sends the to_s message to object referenced by p
19
Getters and Setters
• Lets define getters and setters for Point class
class Point
" def initialize(x,y)
" " @x, @y = x, y
" end
" def x
" " @x
" end
" def y
" " @y
" end
" def x=(value)
" " @x = value
" end
" def y=(value)
" " @y = value
" end
end
p = Point.new(10,20)
p.y = 10 # notice the space
p.x= 20 #
print p.x # same as p.x()
print p.y
Look like variable references.
They are actually method calls
(without parentheses)!
20
Getters and Setters
• Concise way to define getters and setters
• Use symbols to identify the instance variable
class Point
"
" attr_accessor :x, :y
" def initialize(x,y)
" " @x, @y = x, y
" end
end
• attr_accessor creates getters and setters
• attr_reader creates getters only
• attr_writer creates setters only
21
Defining new operators
class Point
" attr_accessor :x, :y
" def initialize(x,y)
" " @x, @y = x, y
" end
" def +(other)
" " Point.new(@x + other.x, @y + other.y)
" end
" def -@ # Unary operator
" " Point.new(-@x, -@y)
" end
" def *(scalar)
" " Point.new(@x * scalar, @y * scalar)
" end
end
+, - and * are just
method names!
22
ClassVariables and
Class methods
• Class variables are shared among all
instances of that class
• Introduced with @@ prefix
• Class methods are methods
associated with a class (not with an
instance)
• Introduced by prepending self. to
the method name
class Point
" attr_accessor :x, :y
" @@total_points = 0
" def initialize(x,y)
" " @x, @y = x, y
" " @@total_points += 1
" end
" def self.total_points
" " @@total_points
" end
end
p1 = Point.new(10,15)
p2 = Point.new(20,30)
print Point.total_points
23
Inheritance
• By default a class extends the Object class
• Inherits all predefined methods
• Classic subclass/superclass relationships
• No multiple inheritance
• Methods can be overridden
• Instance variables are not inherited!
class Point3D < Point
" attr_accessor :z
" def initialize(x,y,z)
" " super(x,y)
" " @z = z
" end
"
end
24
Modules
• A container of:
• Methods
• Constants
• Class variables
• Modules cannot be instantiated
• Effective way to create namespaces
module Base64
" DIGITS = ('A'..'Z').to_a
" def Base64.encode
" end
" def Base64.decode
" end
end
Base64.encode
Base64.decode
Base64::DIGITS
25
Nesting namespaces
• Modules and classes can be
nested
• Better readability and avoid
name clashes
module Base64
" DIGITS = ('A'..'Z').to_a
" class Encoder
" " def encode
" " end
" end
" class Decoder
" " def decoder
" " end
" end
end
a = Base64::Encoder.new
26
Mixins
• If module define some instance methods, they can
be “mixed-in” a class.
• Mixin code can interact with code in the class
module A
" def a
" end
end
module B
" def b1
" end
" def b2
" end
end
class MyClass
" include A
" include B
" def m
" end
end
m = MyClass.new
m.a
m.b1
m.b2
27
Control structures
• Classic control structures:
• If, else, elsif, case, etc. (terminated with “end” keyword)
• Plus some syntactic sugars:
print "greater" if Math::PI > 3Conditional modifier
Unless
unless Math::PI <= 3
" print "greater"
end
28
Loops
• Classic for, while, until, etc:
• The object must have an each method
x = 0
puts x += 1 while x < 10
x = 0
puts x += 1 until x >= 10
array = [1,2,3,4]
for element in array
" puts element
end
hash = {:a => 1, :b => 2, :c => 3}
for key, value in hash
" puts "#{key} => #{value}"
end
Also with modifiers version of loops (one line)
29
Iterators and yield
• Allow to loop over a collection (or value)
• Receive a block of code which is executed with the
current element
• Use yield to execute the passed block
30
Iterators and yield
• Allow to loop over a collection (or value)
• Receive a block of code which is executed with the
current element
• Use yield to execute the passed block
3.times{ puts "thank you!"}
data.each{|x| puts x}
[1,2,3].map{|x| x * x }
factorial = 1
2.upto(n) {|x| factorial *= x}
30
Iterators and yield
• Allow to loop over a collection (or value)
• Receive a block of code which is executed with the
current element
• Use yield to execute the passed block
3.times{ puts "thank you!"}
data.each{|x| puts x}
[1,2,3].map{|x| x * x }
factorial = 1
2.upto(n) {|x| factorial *= x}
30
Yield examples
def my_method
" yield
end
my_method{ puts "hello!"}
Yield without parameters
31
Yield examples
def my_method
" yield
end
my_method{ puts "hello!"}
# This method expects a block.
# It generates n values
# of the form m*i + c for 0..n-1,
# and yields them, one at a time
def sequence(n, m, c)
" i = 0
" while i < n
" " yield m * i + c
" " i += 1
" end
end
sequence(5,3,20){|y| puts y}
Yield without parameters Yield with parameters
31
Blocks
• Delimited with curly braces or do end keywords (i.e., multi line).
• If method does not “yield”, the block is ignored.
• Value returned from a block is the the value of the last expression.
• Invoking return within a block returns from the calling method!
def print_sequence
" SPECIAL_VALUE = 5
" s = sequence(5,3,20) do |y|
" " if y == SPECIAL_VALUE
" " " return 0
" " end
" " y * 2
" end
" print s
end
The return statement exits
from the print_sequence
method!
32
Procs and Lambdas
• Blocks are syntactic structures
• They are not objects!
• However, it is possible to create
block objects:
• Proc
• Lambda
• Invoke method call
33
Procs and Lambdas
• Blocks are syntactic structures
• They are not objects!
• However, it is possible to create
block objects:
• Proc
• Lambda
• Invoke method call
p = Proc.new{|x,y| x + y}
puts p.call(10,20)
Creating a proc object
33
Procs and Lambdas
• Blocks are syntactic structures
• They are not objects!
• However, it is possible to create
block objects:
• Proc
• Lambda
• Invoke method call
p = Proc.new{|x,y| x + y}
puts p.call(10,20)
Creating a proc object
l = lambda{|x,y| x + y}
puts l.call(10,20)
Creating a lambda object
33
Procs and Lambdas
• Blocks are syntactic structures
• They are not objects!
• However, it is possible to create
block objects:
• Proc
• Lambda
• Invoke method call
p = Proc.new{|x,y| x + y}
puts p.call(10,20)
Creating a proc object
l = lambda{|x,y| x + y}
puts l.call(10,20)
Creating a lambda object
Get the “arity” of a block
l = lambda{|x,y| x + y}
puts l.arity
=> 2
33
Converting blocks to procs
• Blocks do not have a name
• Blocks can be converted into proc
• Use & (i.e., ampersand)
# Explicit conversion into proc
def sequence3(n, m, c, &b)
" i=0
" while(i < n)
" " b.call(i*m + c)
" " i += 1
" end
end
sequence3(5, 2, 2) {|x| puts x }
def sequence4(n, m, c, b)
" i=0
" while(i < n)
" " b.call(i*m + c)
" " i += 1
" end
end
p = Proc.new {|x| puts x} # create proc
sequence4(5, 2, 2, p) # ordinary argument
34
Procs vs Lambdas
• Lambda behave similar to method calls
• Blocks behave similar to block evaluation
35
Procs vs Lambdas
• Lambda behave similar to method calls
• Blocks behave similar to block evaluation
def test
" puts "entering method"
" p = Proc.new { puts "entering proc"; return }
" p.call # Invoking the proc makes method return
" puts "exiting method" # This line is NEVER executed
end
Return with proc
35
Procs vs Lambdas
• Lambda behave similar to method calls
• Blocks behave similar to block evaluation
def test
" puts "entering method"
" p = Proc.new { puts "entering proc"; return }
" p.call # Invoking the proc makes method return
" puts "exiting method" # This line is NEVER executed
end
def test
" puts "entering method"
" p = lambda { puts "entering lambda"; return }
" p.call # Invoking the lambda does not make the method
return
" puts "exiting method" # This line IS executed
end
Return with proc
Return with lambda
35
References
36

More Related Content

What's hot

B trees in Data Structure
B trees in Data StructureB trees in Data Structure
B trees in Data Structure
Anuj Modi
 

What's hot (20)

Group By, Having Clause and Order By clause
Group By, Having Clause and Order By clause Group By, Having Clause and Order By clause
Group By, Having Clause and Order By clause
 
C++ Programming
C++ ProgrammingC++ Programming
C++ Programming
 
B trees in Data Structure
B trees in Data StructureB trees in Data Structure
B trees in Data Structure
 
Classification techniques in data mining
Classification techniques in data miningClassification techniques in data mining
Classification techniques in data mining
 
Python programming : Inheritance and polymorphism
Python programming : Inheritance and polymorphismPython programming : Inheritance and polymorphism
Python programming : Inheritance and polymorphism
 
2 3 Trees Algorithm - Data Structure
2 3 Trees Algorithm - Data Structure2 3 Trees Algorithm - Data Structure
2 3 Trees Algorithm - Data Structure
 
Python - Lecture 11
Python - Lecture 11Python - Lecture 11
Python - Lecture 11
 
Sql server T-sql basics ppt-3
Sql server T-sql basics  ppt-3Sql server T-sql basics  ppt-3
Sql server T-sql basics ppt-3
 
Nested Queries Lecture
Nested Queries LectureNested Queries Lecture
Nested Queries Lecture
 
Text Analytics
Text Analytics Text Analytics
Text Analytics
 
Database Management - Lecture 2 - SQL select, insert, update and delete
Database Management - Lecture 2 - SQL select, insert, update and deleteDatabase Management - Lecture 2 - SQL select, insert, update and delete
Database Management - Lecture 2 - SQL select, insert, update and delete
 
SQL Views
SQL ViewsSQL Views
SQL Views
 
An introduction to Jupyter notebooks and the Noteable service
An introduction to Jupyter notebooks and the Noteable serviceAn introduction to Jupyter notebooks and the Noteable service
An introduction to Jupyter notebooks and the Noteable service
 
Data structure stack&queue basics
Data structure stack&queue   basicsData structure stack&queue   basics
Data structure stack&queue basics
 
Python Programming Essentials - M6 - Code Blocks and Indentation
Python Programming Essentials - M6 - Code Blocks and IndentationPython Programming Essentials - M6 - Code Blocks and Indentation
Python Programming Essentials - M6 - Code Blocks and Indentation
 
Python programming : Abstract classes interfaces
Python programming : Abstract classes interfacesPython programming : Abstract classes interfaces
Python programming : Abstract classes interfaces
 
Database Triggers
Database TriggersDatabase Triggers
Database Triggers
 
Binary trees1
Binary trees1Binary trees1
Binary trees1
 
Python Variable Types, List, Tuple, Dictionary
Python Variable Types, List, Tuple, DictionaryPython Variable Types, List, Tuple, Dictionary
Python Variable Types, List, Tuple, Dictionary
 
DML Commands
DML CommandsDML Commands
DML Commands
 

Viewers also liked

Good things in life, can coffee help in diabetes prevention
Good things in life, can coffee help in diabetes preventionGood things in life, can coffee help in diabetes prevention
Good things in life, can coffee help in diabetes prevention
CafeSalud
 

Viewers also liked (18)

Manal p.
Manal p.Manal p.
Manal p.
 
Sesc
SescSesc
Sesc
 
The Facts
The FactsThe Facts
The Facts
 
Sujet bac 2011 sm avec la correction
Sujet bac 2011 sm  avec la correctionSujet bac 2011 sm  avec la correction
Sujet bac 2011 sm avec la correction
 
Manal p.
Manal p.Manal p.
Manal p.
 
Metaprogramming in Ruby
Metaprogramming in RubyMetaprogramming in Ruby
Metaprogramming in Ruby
 
La balanca
La balancaLa balanca
La balanca
 
Coffee heart and blood vessels
Coffee heart and blood vesselsCoffee heart and blood vessels
Coffee heart and blood vessels
 
An Introduction To Cognitive Behavioural therapy (What Is CBT?)
An Introduction To Cognitive Behavioural therapy (What Is CBT?)An Introduction To Cognitive Behavioural therapy (What Is CBT?)
An Introduction To Cognitive Behavioural therapy (What Is CBT?)
 
Good things in life, can coffee help in diabetes prevention
Good things in life, can coffee help in diabetes preventionGood things in life, can coffee help in diabetes prevention
Good things in life, can coffee help in diabetes prevention
 
Manal p.
Manal p.Manal p.
Manal p.
 
La balanca
La balancaLa balanca
La balanca
 
Samui Luxury Villas - The Estates Samui
Samui Luxury Villas - The Estates SamuiSamui Luxury Villas - The Estates Samui
Samui Luxury Villas - The Estates Samui
 
Sudaneses
SudanesesSudaneses
Sudaneses
 
Reconstruccion craneo facial
Reconstruccion craneo facialReconstruccion craneo facial
Reconstruccion craneo facial
 
Coffee stomach intestines and liver
Coffee stomach intestines and liverCoffee stomach intestines and liver
Coffee stomach intestines and liver
 
CICAS Calendario 2011
CICAS Calendario 2011CICAS Calendario 2011
CICAS Calendario 2011
 
Coffee and brain
Coffee and brainCoffee and brain
Coffee and brain
 

Similar to Introduction to Ruby Programming Language

Taxonomy of Scala
Taxonomy of ScalaTaxonomy of Scala
Taxonomy of Scala
shinolajla
 

Similar to Introduction to Ruby Programming Language (20)

Taxonomy of Scala
Taxonomy of ScalaTaxonomy of Scala
Taxonomy of Scala
 
Introduction to Python for Plone developers
Introduction to Python for Plone developersIntroduction to Python for Plone developers
Introduction to Python for Plone developers
 
C# - What's next
C# - What's nextC# - What's next
C# - What's next
 
Get started with Lua - Hackference 2016
Get started with Lua - Hackference 2016Get started with Lua - Hackference 2016
Get started with Lua - Hackference 2016
 
Scala: Object-Oriented Meets Functional, by Iulian Dragos
Scala: Object-Oriented Meets Functional, by Iulian DragosScala: Object-Oriented Meets Functional, by Iulian Dragos
Scala: Object-Oriented Meets Functional, by Iulian Dragos
 
Introduction to Java Strings, By Kavita Ganesan
Introduction to Java Strings, By Kavita GanesanIntroduction to Java Strings, By Kavita Ganesan
Introduction to Java Strings, By Kavita Ganesan
 
Java
Java Java
Java
 
Introduction to web programming for java and c# programmers by @drpicox
Introduction to web programming for java and c# programmers by @drpicoxIntroduction to web programming for java and c# programmers by @drpicox
Introduction to web programming for java and c# programmers by @drpicox
 
Javascript
JavascriptJavascript
Javascript
 
C# 7.x What's new and what's coming with C# 8
C# 7.x What's new and what's coming with C# 8C# 7.x What's new and what's coming with C# 8
C# 7.x What's new and what's coming with C# 8
 
Java 103 intro to java data structures
Java 103   intro to java data structuresJava 103   intro to java data structures
Java 103 intro to java data structures
 
C++ process new
C++ process newC++ process new
C++ process new
 
Scala coated JVM
Scala coated JVMScala coated JVM
Scala coated JVM
 
Code for Startup MVP (Ruby on Rails) Session 2
Code for Startup MVP (Ruby on Rails) Session 2Code for Startup MVP (Ruby on Rails) Session 2
Code for Startup MVP (Ruby on Rails) Session 2
 
JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)
 
JavaScript in 2016
JavaScript in 2016JavaScript in 2016
JavaScript in 2016
 
From Ruby to Scala
From Ruby to ScalaFrom Ruby to Scala
From Ruby to Scala
 
C# - What's Next?
C# - What's Next?C# - What's Next?
C# - What's Next?
 
Concurrent programming with Celluloid (MWRC 2012)
Concurrent programming with Celluloid (MWRC 2012)Concurrent programming with Celluloid (MWRC 2012)
Concurrent programming with Celluloid (MWRC 2012)
 
Introduction to Scala for JCConf Taiwan
Introduction to Scala for JCConf TaiwanIntroduction to Scala for JCConf Taiwan
Introduction to Scala for JCConf Taiwan
 

Recently uploaded

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Recently uploaded (20)

GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 

Introduction to Ruby Programming Language

  • 1. Introduction to Ruby Nicola Calcavecchia - 19/04/2013 calcavecchia@{elet.polimi.it|gmail.com} Principles of Programming Languages 1
  • 2. Main Features • Dynamically Typed. • Purely Object Oriented. • Supports Meta-Programming. • Garbage collected. • Supports inheritance and mixins. www.ruby-lang.org 2
  • 3. History • Created byYukihiro Matsumoto (Matz) in 1995. • Influenced by Smalltalk, Perl, Lisp and Python • Current stable release: 2.0.0-p0 • Interpreters: • MRI (Matz’s Ruby Interpreter) • YARV (now official) • Others: JRuby, Rubinius, IronRuby 3
  • 4. Diffusion • Killer apps: • Ruby on Rails (web framework) • Puppet, Chef (configuration management) • Capistrano (deploy management utility) • and many others... Source: https://github.com/languages (5/04/2013) 4
  • 5. Getting started • irb executable: interactive shell (i.e., REPL). • ruby executable: language interpreter. • File extensions: .rb ruby hello.rb 5
  • 6. Hello World (and a glimpse at Ruby Syntax) print("Hello World"); print("Hello World") • Semicolons are optional: • Practically never used. • Use newline instead. • Classic (and verbose) • Parenthesis in methods are optional: • Cleaner syntax! • Works well for DSLs (will see later...). print "Hello World" Cool, but pay attention: f(3+2) + 1 f (3+2) + 1 6
  • 7. Data Types • Ruby has many built-in data types: • Numeric: Integer, Floats, Complex, Rational, etc. • String: single-quoted, doubly-quoted, here documents, backtick, characters, etc. • Array • Hash • Boolean and nil • etc. 7
  • 8. Data Types • Ruby has many built-in data types: • Numeric: Integer, Floats, Complex, Rational, etc. • String: single-quoted, doubly-quoted, here documents, backtick, characters, etc. • Array • Hash • Boolean and nil • etc. All are implemented by objects! 7
  • 9. Numeric Types • Implemented as objects •All inherits from Numeric class 404 # Fixnum 1_000_000_000 # Better readability 241.1 # Float -3.7e4 # Float 0xFF # Fixnum given in hex 1 + 1.0 # Float 8
  • 10. Strings • Enclosed in single or double quotes • Small differences between the two • String interpolation • Unicode escapes • Mutable objects "six times four is: #{6*4}" => "six times four is: 24" "this is a string" => "this is a string" 'this is a string too' => "this is a string too" "u20ac" => "€" 9
  • 11. Arrays • Dynamically sized • Untyped and mutable • Example: [1, 2, 3] # an array with three Fixnum objects [] #empty array [0] * 10 # new array containing 10 zeros ["a string", 42, 3.3, []] # can hold any type of object a = [1, 1, 2, 3, 5, 8] a[0] # first element is 1 a[-1] # last element is 8 a[10] # nil if exceeding limits a[7] = 21 # extends the array (with nil) a[2,3] # subarray starting from 2, 3 elements long a[2,3] = ['A','B','C'] #substitute subarray a + [0, -1] # concatenates two arrays [1, 2, 3, 4, 5] - [2, 4] # removes elements from the first array 10
  • 12. Hashes • Unordered collection of key-value pairs • Mutable • Indexed by keys a = {} # create an empty hash a['one'] = 1 # map string 'one' to Fixnum 1 a['two'] = 2# map string 'two' to Fixnum 1 a = {'one' => 1, 'two' => 2} # create and initialize Hash a['one'] => 1 11
  • 13. Symbols • Same as scheme symbols • Constant, immutable strings • I.e., placeholder for identifiers and strings • Always prefixed by a semicolon • Created in memory as soon as referenced :red # create a new symbol called red "blue".to_sym # convert a string to a symbol => :blue :"red" # same as :red hash = {:red => "red", :blue => "blue" } # often used in hashes (i.e., fast) 12
  • 14. Boolean and Nil • true: logical true value • Singleton instance of TrueClass • false: logical false value • Singleton instance of FalseClass • nil: null value (i.e., absence of value) • Singleton instance of NilClass 13
  • 15. Rules for objects 1. All variables are references to objects (there are no primitive types!) 2. Objects communicate via messages (i.e., method calls) 3. Each object has its own (private) state 4. Every object is an instance of a class 14
  • 16. Object References • It always works with references to object (i.e., similar to Scheme, Java) • Call by object sharing: • When an object is passed to a method, its reference is passed (i.e., the reference is copied). s = "Ruby" # Creates a String object. Store the reference to it in s t = s # Copy reference to t t[-1] = "" # Modify the object through reference to t print s # Access (modified) object through s t = "Java" # t now refers to a different object print s,t # Prints "RubJava" 15
  • 17. Classes and methods • class keyword to define a class • def to define methods class ClassName " def method1(par1, par2) " " expression1 " end " def method2(par1, par2) " " expression2 " end end 16
  • 18. Constructor and instance variables • Method initialize is the constructor • Instance variables start with @ symbol class Point " def initialize(x,y) " " @x = x " " @y = y " end " def to_s() " " return "#{@x},#{@y}" " end end 17
  • 19. Cleaner version... • Ruby supports “parallel assignments” • Return is implicit (i.e., like Scheme): • Last expression is returned if not specified class Point " def initialize(x,y) " " @x, @y = x, y " end " def to_s() " " "#{@x},#{@y}" " end end Instance variables are created only when stored for the first time 18
  • 20. Creating an object • Invoke constructor with new p = Point.new(10,20) • Invoking a method: print p.to_s • Sends the to_s message to object referenced by p 19
  • 21. Getters and Setters • Lets define getters and setters for Point class class Point " def initialize(x,y) " " @x, @y = x, y " end " def x " " @x " end " def y " " @y " end " def x=(value) " " @x = value " end " def y=(value) " " @y = value " end end p = Point.new(10,20) p.y = 10 # notice the space p.x= 20 # print p.x # same as p.x() print p.y Look like variable references. They are actually method calls (without parentheses)! 20
  • 22. Getters and Setters • Concise way to define getters and setters • Use symbols to identify the instance variable class Point " " attr_accessor :x, :y " def initialize(x,y) " " @x, @y = x, y " end end • attr_accessor creates getters and setters • attr_reader creates getters only • attr_writer creates setters only 21
  • 23. Defining new operators class Point " attr_accessor :x, :y " def initialize(x,y) " " @x, @y = x, y " end " def +(other) " " Point.new(@x + other.x, @y + other.y) " end " def -@ # Unary operator " " Point.new(-@x, -@y) " end " def *(scalar) " " Point.new(@x * scalar, @y * scalar) " end end +, - and * are just method names! 22
  • 24. ClassVariables and Class methods • Class variables are shared among all instances of that class • Introduced with @@ prefix • Class methods are methods associated with a class (not with an instance) • Introduced by prepending self. to the method name class Point " attr_accessor :x, :y " @@total_points = 0 " def initialize(x,y) " " @x, @y = x, y " " @@total_points += 1 " end " def self.total_points " " @@total_points " end end p1 = Point.new(10,15) p2 = Point.new(20,30) print Point.total_points 23
  • 25. Inheritance • By default a class extends the Object class • Inherits all predefined methods • Classic subclass/superclass relationships • No multiple inheritance • Methods can be overridden • Instance variables are not inherited! class Point3D < Point " attr_accessor :z " def initialize(x,y,z) " " super(x,y) " " @z = z " end " end 24
  • 26. Modules • A container of: • Methods • Constants • Class variables • Modules cannot be instantiated • Effective way to create namespaces module Base64 " DIGITS = ('A'..'Z').to_a " def Base64.encode " end " def Base64.decode " end end Base64.encode Base64.decode Base64::DIGITS 25
  • 27. Nesting namespaces • Modules and classes can be nested • Better readability and avoid name clashes module Base64 " DIGITS = ('A'..'Z').to_a " class Encoder " " def encode " " end " end " class Decoder " " def decoder " " end " end end a = Base64::Encoder.new 26
  • 28. Mixins • If module define some instance methods, they can be “mixed-in” a class. • Mixin code can interact with code in the class module A " def a " end end module B " def b1 " end " def b2 " end end class MyClass " include A " include B " def m " end end m = MyClass.new m.a m.b1 m.b2 27
  • 29. Control structures • Classic control structures: • If, else, elsif, case, etc. (terminated with “end” keyword) • Plus some syntactic sugars: print "greater" if Math::PI > 3Conditional modifier Unless unless Math::PI <= 3 " print "greater" end 28
  • 30. Loops • Classic for, while, until, etc: • The object must have an each method x = 0 puts x += 1 while x < 10 x = 0 puts x += 1 until x >= 10 array = [1,2,3,4] for element in array " puts element end hash = {:a => 1, :b => 2, :c => 3} for key, value in hash " puts "#{key} => #{value}" end Also with modifiers version of loops (one line) 29
  • 31. Iterators and yield • Allow to loop over a collection (or value) • Receive a block of code which is executed with the current element • Use yield to execute the passed block 30
  • 32. Iterators and yield • Allow to loop over a collection (or value) • Receive a block of code which is executed with the current element • Use yield to execute the passed block 3.times{ puts "thank you!"} data.each{|x| puts x} [1,2,3].map{|x| x * x } factorial = 1 2.upto(n) {|x| factorial *= x} 30
  • 33. Iterators and yield • Allow to loop over a collection (or value) • Receive a block of code which is executed with the current element • Use yield to execute the passed block 3.times{ puts "thank you!"} data.each{|x| puts x} [1,2,3].map{|x| x * x } factorial = 1 2.upto(n) {|x| factorial *= x} 30
  • 34. Yield examples def my_method " yield end my_method{ puts "hello!"} Yield without parameters 31
  • 35. Yield examples def my_method " yield end my_method{ puts "hello!"} # This method expects a block. # It generates n values # of the form m*i + c for 0..n-1, # and yields them, one at a time def sequence(n, m, c) " i = 0 " while i < n " " yield m * i + c " " i += 1 " end end sequence(5,3,20){|y| puts y} Yield without parameters Yield with parameters 31
  • 36. Blocks • Delimited with curly braces or do end keywords (i.e., multi line). • If method does not “yield”, the block is ignored. • Value returned from a block is the the value of the last expression. • Invoking return within a block returns from the calling method! def print_sequence " SPECIAL_VALUE = 5 " s = sequence(5,3,20) do |y| " " if y == SPECIAL_VALUE " " " return 0 " " end " " y * 2 " end " print s end The return statement exits from the print_sequence method! 32
  • 37. Procs and Lambdas • Blocks are syntactic structures • They are not objects! • However, it is possible to create block objects: • Proc • Lambda • Invoke method call 33
  • 38. Procs and Lambdas • Blocks are syntactic structures • They are not objects! • However, it is possible to create block objects: • Proc • Lambda • Invoke method call p = Proc.new{|x,y| x + y} puts p.call(10,20) Creating a proc object 33
  • 39. Procs and Lambdas • Blocks are syntactic structures • They are not objects! • However, it is possible to create block objects: • Proc • Lambda • Invoke method call p = Proc.new{|x,y| x + y} puts p.call(10,20) Creating a proc object l = lambda{|x,y| x + y} puts l.call(10,20) Creating a lambda object 33
  • 40. Procs and Lambdas • Blocks are syntactic structures • They are not objects! • However, it is possible to create block objects: • Proc • Lambda • Invoke method call p = Proc.new{|x,y| x + y} puts p.call(10,20) Creating a proc object l = lambda{|x,y| x + y} puts l.call(10,20) Creating a lambda object Get the “arity” of a block l = lambda{|x,y| x + y} puts l.arity => 2 33
  • 41. Converting blocks to procs • Blocks do not have a name • Blocks can be converted into proc • Use & (i.e., ampersand) # Explicit conversion into proc def sequence3(n, m, c, &b) " i=0 " while(i < n) " " b.call(i*m + c) " " i += 1 " end end sequence3(5, 2, 2) {|x| puts x } def sequence4(n, m, c, b) " i=0 " while(i < n) " " b.call(i*m + c) " " i += 1 " end end p = Proc.new {|x| puts x} # create proc sequence4(5, 2, 2, p) # ordinary argument 34
  • 42. Procs vs Lambdas • Lambda behave similar to method calls • Blocks behave similar to block evaluation 35
  • 43. Procs vs Lambdas • Lambda behave similar to method calls • Blocks behave similar to block evaluation def test " puts "entering method" " p = Proc.new { puts "entering proc"; return } " p.call # Invoking the proc makes method return " puts "exiting method" # This line is NEVER executed end Return with proc 35
  • 44. Procs vs Lambdas • Lambda behave similar to method calls • Blocks behave similar to block evaluation def test " puts "entering method" " p = Proc.new { puts "entering proc"; return } " p.call # Invoking the proc makes method return " puts "exiting method" # This line is NEVER executed end def test " puts "entering method" " p = lambda { puts "entering lambda"; return } " p.call # Invoking the lambda does not make the method return " puts "exiting method" # This line IS executed end Return with proc Return with lambda 35