SlideShare a Scribd company logo
Intro to Ruby
Women Who Code Belfast

h.campbell@kainos.com : hcampbell07 : heatherjcampbell.com
Syntactic

Sugar

Productive
Developers
• Everything is an Expression

• Everything is an Object
• Supports Dynamic Reflection
GETTING STARTED
current_count = 5
final_salary = 30000.00

Snake Case
Readable
String.methods.sort
String.instance_methods.sort

Methods
my_array.empty?
person.retired?

True or False
str.upcase vs str.upcase!

Create New vs
Modify Existing
io.rb
print “Enter your name: ”
name = gets
puts name.strip + “ is learning Ruby”

Input / Output
[4,2,3,5].sort.map{ |e| e * e}.join(',')
# "4,9,16,25"

Method Chaining
• Write some code to ask a user to input a
number. Take the number multiply it by
10 and display it back to the user
• Find a method to capitalize a string
• Check the class of 1. (using the .class
method) then find a method to check if
the number is even

Exercises
TYPES
true.class
# TrueClass
false.class
# FalseClass
true.to_s
# "true"

Boolean
1.class
# Fixnum

1111111111.class
# Bignum

Fixnum.superclass
# Integer

Bignum.superclass
# Integer

111_000_000.class
# Fixnum

1.2345.class
# Float

Numbers
String.method.count
# Lots of helpful methods!
"Ruby" * 4
# "RubyRubyRubyRuby"
"Ruby" + " " + "Ruby"
# "Ruby Ruby"
a = "I don’t know Ruby"
a*"don’t"+ = "do"
# "I do know Ruby"

String
number_of_girls = 4
number_of_boys = 6
puts "number of girls #{number_of_girls}"
puts "number of boys #{number_of_boys}"
puts "number of people
#{number_of_boys + number_of_girls}"

Interpolation
phone = "(028 90)454 545"
phone.gsub!(/D/, "")
puts "Phone Number : #{phone}"
# "02890454545"

puts "Heather Campbell".gsub(/([a-zA-Z]+)
([a-zA-Z]+)/, "2, 1")
# "Campbell, Heather"

Regex
attr_accessor :driver
:small :medium :large
a = :small
b = :small
a.object_id == b.object_id
# true
:small.to_s
# "small "

"small".to_sym
# :small

Symbols
arr = [1,2,'three', :big]
arr.size # 4
arr.empty? # false
arr[1] # 2
arr[-1] # :big
arr[1..3] # [2,'three', :big]
arr[4..5] = [:east, :west]
# [1,2,'three', :big, :east, :west]
arr << 10
# [1,2,'three', :big, :east, :west,10]

Arrays
[1,2,3].map { |e| e * e}
# [1,4,9]
[2,2,3].reduce{|total,v| total * v}
# 12
['act', 'bat', 'them'] .all? { |w| w.length >= 3 }
# true

Enumerable
h = {'France' => 'Paris', 'Ireland' => 'Dublin' }
h = {France: 'Paris', Ireland: 'Dublin' }
h[:France]
# 'Paris‘
h[:Italy] = 'Rome'
# h = {France: 'Paris', Ireland: 'Dublin', Italy:
# 'Rome' }
h.each {|k,v| puts "key: #{k} t value: #{v}"}
h.any? { |k,v| v == 'Rome' }

Hashes
(1..5).each{|v| p v}
# 1,2,3,4,5
(1…5).each{|v| p v}
# 1,2,3,4
(10..20).include?(19) # true
(2..5).end # 5
("aa".."ae").each{|v| p v}
# "aa","ab","ac","ad","ae"

Ranges
def get_values; [1,2,3,4]; end;
first, _, _, last = get_values
# first = 1, last = 4
a, *b, c = get_values
# a = 1, b = [2,3],c = 4
r = (0..5)
a = [1,2,*r]
# a = [1,2,0,1,2,3,4,5]

Splat Operator
•
•

Separate an array [1,2,3,4] into 2 variables
one holding the head of the array (i.e 1) and
the other the rest of the array [2,3,4]
Create a hash of months and days in a month
e.g. {January: 31, ..}. For each month print out
the month name and number of days. Then
print out totals days in year by summing the
hashes values

Exercises
FLOW CONTROL
if mark > 75
report = "great"
elsif mark > 50
report = "good"
else
report = "needs work"
end

report =
if mark > 75 then
"great"
elsif mark > 50 then
"good"
else
"needs work"
end

if else
if !order.nil?
order.calculate_tax
end
order.calculate_tax unless order.nil?

unless
speed = 60
limit = 40
speed > limit ? puts("Speeding!") : puts("Within
Limit")

ternary operator
mark = 42 && mark * 2
# translates to mark = (42 && mark) * 2
mark = 42 and mark * 2
# returns 84
post = Posts.locate(post_id) and post.publish
# publishes post if it is located
if engine.cut_out?
engine.restart or enable_emergency_power
end

and / or
grade = case mark
when 90..100
"A"
when 70..89
"B"
when 60..69
"C"
when 50..59
"D"
when 40..49
"E"
else
"F"
end

case unit
when String
puts "A String!"
when TrueClass
puts "So True!"
when FalseClass
puts "So False!"
end

case
while count < max
puts "Inside the loop. count = #{count}"
count +=1
end
puts "count = #{count += 1}" while count < max

while
until count > max
puts "Inside the loop. count = #{count}"
count +=1
end
array = [1,2,3,4,5,6,7]
array.pop until array.length < 3

until
begin
puts "Inside the loop. count = #{count}"
count +=1
end while count < max

looping block
for count in (1..10)
puts "Inside the loop: count = #{count}"
end

for
animals = {cat: "meow ", cow: "moo "}

animals.each do |k,v|
puts "The #{k} goes #{v}"
end
animals = {cat: "meow ", cow: "moo "}

animals.each {|k,v| puts "The #{k} goes #{v} "}

iterators
magic_number = 5; found = false; i = 0; input = 0;
while i < 3
print "Please enter a number between 1 and 10: "
input = gets.to_i
unless input.between?(1,10)
print "invalid number"; redo
end
if input == magic_number
found = true; break
end
i += 1
end
found ? put "found! " : put " bad luck "

flow control
def display_content(name)
f = File.open(name, 'r')
line_num=0
# raise 'A test exception.'
f.each {|line| print "#{line_num += 1} #{line}"}
rescue Exception => e
puts "ooops"; puts e.message; puts e.backtrace
else
puts "nSuccessfully displayed!"
ensure
if f then f.close; puts "file safely closed"; end
end

exception handling
def get_patients()
patients = API.request("/patients")
rescue RuntimeError => e
attempts ||= 0
attempts += 1
if attempts < 3
puts e.message + ". Retrying request. “
retry
else
puts "Failed to retrieve patients"
raise
end
end

exception handling
•
•
•
•

Write some conditional logic to capitalize a
string if it is not in uppercase
Print out your name 10 times
Print the string “This is sentence number 1”
where the number 1 changes from 1 to 10
Write a case statements which outputs
“Integer” if the variable is an integer, “Float” if
it is a floating point number or else “don’t
know!”

Exercises
CLASSES
class Vehicle
def drive(destination)
@destination = destination
end

end

Classes
class Vehicle
attr_accessor :destination

def drive(destination)
self.destination = destination
# do more drive stuff
end
end

Accessors
attr_accessor
attr_reader
attr_writer

Accessors
class Vehicle
attr_accessor :colour, :make
def initialize(colour, make)
@make = make
@colour = colour
end
end

Constructor
class SuperCar < Vehicle
def drive(destination)
self.destination = destination
puts 'driving super fast'
end
end

Inheritance
class SuperCar < Vehicle
attr_accessor :driver

def drive(circuit, driver)
self.destination = destination
self.driver = driver
puts 'driving super fast'
end
end

Inheritance
“If it walks like a duck and talks
like a duck, it must be a duck”

Duck Typing
class Person
def quack()
puts 'pretends to quack'
end
end
class Duck
def quack()
puts 'quack quack'
end
end

Duck Typing
def call_quack(duck)
duck.quack
end
call_quack(Duck.new)
# quack quack

call_quack(Person.new)
# pretends to quack

Duck Typing
class Vehicle

class Vehicle

def crash()
explode
end

def crash()
explode
end

private
def explode()
puts "Boom!"
end
end

def explode()
puts "Boom!"
end
private :explode
end

Method Visibility
class SuperCar < Vehicle
def explode()
puts "Massive Boom!"
end
end

Method Visibility
result = class Test
answer = 7+5
puts " Calculating in class: " + answer.to_s
answer
end
puts "Output of the class: " + result.to_s

Executable
class Rocket
….

end

r = Rocket.new
class Rocket
def land()
puts "Back on Earth"
end
end

r.land

Open Classes
class String
def shout
self.upcase!
self + "!!!"
end
def empty?
true
end
end

Monkey Patching
a = "abc"
b=a
c = "abc"
a.equal?(b)
# true
a.equal?(c)
# false
a == b
# true
a == c
# true

Equality
•
•
•
•
•
•

Create a class to represent a Computer
Create an instance of the Computer called
computer
Add a starting_up method
Create a class WindowsComputer which
inherits from Computer
Create an instance of the WindowsComputer
called wcomputer and call starting_up on it
Alter WindowsComputer to allow the user to
set a name value when they create an
instance. Allow the user to set and get the
name attribute

Exercises
METHODS
# Java
public Car() , …public Car(String make) { }
public Car(String make, String model) { }
public Car(String make, String model, String colour) { }
# Ruby
def initialize (make = :Ford,
model = Car.get_default_model(make),
colour = (make == :Ferrari ? 'red' : 'silver') )
…
end

Overloading Methods
def create_car (make = :Ford,
model = get_default_model(make),
colour)
…
end
create_car('red' )

Method Parameters
def produce_student(name, *subjects)
…
end
produce_student('June Black', 'Chemistry',
'Maths', 'Computing' )
subject_list = ['Chemistry', 'Maths', 'Computing']
produce_student('June Black', *subject_list)

Variable Length Param List
class Meteor
attr_accessor :speed
def initialize()
@speed = 0
end
def +(amt)
@speed += amt
end
def -(amt)
@speed > amt ? (@speed -= amt) : (@speed = 0)
end
end

Operators
class Roman
def self.method_missing name, *args
roman = name.to_s
roman.gsub!("IV", "IIII")
roman.gsub!("IX", "VIIII")
roman.gsub!("XL", "XXXX")
roman.gsub!("XC", "LXXXX")
(roman.count("I") +
roman.count("V") * 5 +
roman.count("X") * 10 +
roman.count("L") * 50 +
roman.count("C") * 100)
end
end

Method
Missing
handlers = { up_arrow: :tilt_up,
down_arrow: :tilt_down,
left_arrow: :turn_left,
right_arrow: :turn_right}
ship.__send__(handlers[input])

Send
•
•
•
•
•
•

Alter the WindowsComputer class you created in the
last exercise to make the name parameter optional
Try creating an instance with and without a name
value
Add a mandatory attribute called owner to the class
and alter initialize to set it.
Try creating a new instance with no, 1 and 2
parameter values. What happens?
add a method display_details to output the name
and owner of the machine and try calling it using
__send__
now make display_details private and try calling it
directly and using __send__. Notice anything odd?

Exercises
OTHER FEATURES
def block_example
puts 'Optional block example.'
if block_given?
yield "Heather"
else
puts 'No block. Very Empty'
end
puts 'End of example'
end

Blocks
def with_timing
start = Time.now
if block_given?
yield
puts 'Time taken:
#{Time.now - start}'
end
end

Blocks
def add_numbers(x, y)
x+y
end
alter the above method to accept a block and
execute it if one is supplied. Call it with a block to
provide debug i.e. displaying the method name
and values passed

Exercises
TESTING
Test
Driven
Development
Behaviour
Driven
Development
require 'minitest/autorun'
require '../lib/People'
class TestEmployee < MiniTest::Unit::TestCase
def setup
@employee = Employee.new
end
def test_employer
assert_equal "Kainos", @employee.employer
end

end

MiniTest
require "minitest/autorun"
describe Employee do
before do
@employee = Employee.new
end
describe "when asked for an employer" do
it "must provide one" do
@employee.employer.must_equal "Kainos"
end
end
end

MiniTest
# bowling_spec.rb
require 'bowling'
describe Bowling, "#score" do
it "returns 0 for all gutter game" do
bowling = Bowling.new
20.times { bowling.hit(0) }
bowling.score.should eq(0)
end
end

RSpec
# division.feature
Feature: Division
In order to avoid silly mistakes
Cashiers must be able to calculate a fraction
Scenario: Regular numbers
* I have entered 3 into the calculator
* I have entered 2 into the calculator
* I press divide
* the result should be 1.5 on the screen

Cucumber
#calculator_steps.rb

Before do
@calc = Calculator.new
end
Given /I have entered (d+) into the calculator/ do
|n|
@calc.push n.to_i
end
When /I press (w+)/ do |op|
@result = @calc.send op
end

Cucumber
Want to Learn More?
Codecademy
http://www.codecademy.com/tracks/ruby

CodeSchool
https://www.codeschool.com/paths/ruby

Seven Languages in Seven Weeks
pragprog.com/book/btlang/seven-languages-in-seven-weeks
Want to Learn More?
Programming Ruby

pragprog.com/book/ruby/programming-ruby
First edition available for free online at
http://ruby-doc.com/docs/ProgrammingRuby/

Ruby Koans
http://rubykoans.com

Pluralsight
Any Questions?

More Related Content

What's hot (20)

PDF
Deep Dive Into Swift
Sarath C
 
PPTX
API design: using type classes and dependent types
bmlever
 
PPTX
Python programming workshop session 1
Abdul Haseeb
 
PDF
Oh Crap, I Forgot (Or Never Learned) C! [CodeMash 2010]
Chris Adamson
 
ODP
Beginning Perl
Dave Cross
 
PDF
The Power of Composition (NDC Oslo 2020)
Scott Wlaschin
 
PPTX
Python programming workshop session 3
Abdul Haseeb
 
PDF
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014
hwilming
 
PDF
Xtext Webinar
Heiko Behrens
 
PPTX
Python workshop session 6
Abdul Haseeb
 
PPT
SQL Devlopment for 10 ppt
Tanay Kishore Mishra
 
PPT
Object Orientation vs. Functional Programming in Python
Python Ireland
 
PPTX
Python programming workshop session 2
Abdul Haseeb
 
PPTX
Functional Programming in JavaScript by Luis Atencio
Luis Atencio
 
PDF
What are monads?
José Luis García Hernández
 
PPT
P H P Part I, By Kian
phelios
 
PPTX
TEMPLATES IN JAVA
MuskanSony
 
PPTX
Python programming workshop session 4
Abdul Haseeb
 
PDF
Introduction to ad-3.4, an automatic differentiation library in Haskell
nebuta
 
PPTX
Ruby Basics
NagaLakshmi_N
 
Deep Dive Into Swift
Sarath C
 
API design: using type classes and dependent types
bmlever
 
Python programming workshop session 1
Abdul Haseeb
 
Oh Crap, I Forgot (Or Never Learned) C! [CodeMash 2010]
Chris Adamson
 
Beginning Perl
Dave Cross
 
The Power of Composition (NDC Oslo 2020)
Scott Wlaschin
 
Python programming workshop session 3
Abdul Haseeb
 
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014
hwilming
 
Xtext Webinar
Heiko Behrens
 
Python workshop session 6
Abdul Haseeb
 
SQL Devlopment for 10 ppt
Tanay Kishore Mishra
 
Object Orientation vs. Functional Programming in Python
Python Ireland
 
Python programming workshop session 2
Abdul Haseeb
 
Functional Programming in JavaScript by Luis Atencio
Luis Atencio
 
P H P Part I, By Kian
phelios
 
TEMPLATES IN JAVA
MuskanSony
 
Python programming workshop session 4
Abdul Haseeb
 
Introduction to ad-3.4, an automatic differentiation library in Haskell
nebuta
 
Ruby Basics
NagaLakshmi_N
 

Viewers also liked (7)

DOC
Campbell Resume
Steve Campbell
 
PDF
The Importance of Devops
Heather Campbell
 
PPTX
Feel the Fear… And Don’t Do It Anyway Heather Campbell, Managing Director, Co...
TALiNT Partners
 
DOCX
Heather Campbell Resume with skills
Heather Campbell
 
DOCX
Stephen Campbell Resume
Stephen Campbell
 
PDF
SCampbell Unofficial Transcript.PDF
Stephen Campbell
 
PPTX
Integrating BIM and LEAN for Project Delivery - Construction of a Major Hospi...
CCT International
 
Campbell Resume
Steve Campbell
 
The Importance of Devops
Heather Campbell
 
Feel the Fear… And Don’t Do It Anyway Heather Campbell, Managing Director, Co...
TALiNT Partners
 
Heather Campbell Resume with skills
Heather Campbell
 
Stephen Campbell Resume
Stephen Campbell
 
SCampbell Unofficial Transcript.PDF
Stephen Campbell
 
Integrating BIM and LEAN for Project Delivery - Construction of a Major Hospi...
CCT International
 
Ad

Similar to Intro to ruby (20)

PDF
Ruby Topic Maps Tutorial (2007-10-10)
Benjamin Bock
 
PDF
Story for a Ruby on Rails Single Engineer
TylerJohnson988371
 
PDF
Design Patterns the Ruby way - ConFoo 2015
Fred Heath
 
PPT
introduction to javascript concepts .ppt
ansariparveen06
 
PDF
The Great Scala Makeover
Garth Gilmour
 
PPT
Basics of Javascript
Universe41
 
PPT
fundamentals of JavaScript for students.ppt
dejen6
 
PDF
Game Design and Development Workshop Day 1
Troy Miles
 
KEY
Ruby
Kerry Buckley
 
PDF
Scala for Java Programmers
Eric Pederson
 
PDF
Cocoa Design Patterns in Swift
Michele Titolo
 
KEY
Desarrollando aplicaciones web en minutos
Edgar Suarez
 
PPTX
Python Workshop - Learn Python the Hard Way
Utkarsh Sengar
 
PDF
Ruby Intro {spection}
Christian KAKESA
 
PDF
Functional Programming with Groovy
Arturo Herrero
 
KEY
Refactor like a boss
gsterndale
 
PPTX
PHP PPT FILE
AbhishekSharma2958
 
PDF
Blocks by Lachs Cox
lachie
 
PDF
Ruby Programming Language
Duda Dornelles
 
PDF
A linguagem de programação Ruby - Robson "Duda" Sejan Soares Dornelles
Tchelinux
 
Ruby Topic Maps Tutorial (2007-10-10)
Benjamin Bock
 
Story for a Ruby on Rails Single Engineer
TylerJohnson988371
 
Design Patterns the Ruby way - ConFoo 2015
Fred Heath
 
introduction to javascript concepts .ppt
ansariparveen06
 
The Great Scala Makeover
Garth Gilmour
 
Basics of Javascript
Universe41
 
fundamentals of JavaScript for students.ppt
dejen6
 
Game Design and Development Workshop Day 1
Troy Miles
 
Scala for Java Programmers
Eric Pederson
 
Cocoa Design Patterns in Swift
Michele Titolo
 
Desarrollando aplicaciones web en minutos
Edgar Suarez
 
Python Workshop - Learn Python the Hard Way
Utkarsh Sengar
 
Ruby Intro {spection}
Christian KAKESA
 
Functional Programming with Groovy
Arturo Herrero
 
Refactor like a boss
gsterndale
 
PHP PPT FILE
AbhishekSharma2958
 
Blocks by Lachs Cox
lachie
 
Ruby Programming Language
Duda Dornelles
 
A linguagem de programação Ruby - Robson "Duda" Sejan Soares Dornelles
Tchelinux
 
Ad

Recently uploaded (20)

PPTX
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PDF
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PPTX
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
PDF
The Builder’s Playbook - 2025 State of AI Report.pdf
jeroen339954
 
PPTX
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
PDF
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
PDF
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
PDF
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PPTX
MSP360 Backup Scheduling and Retention Best Practices.pptx
MSP360
 
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
PDF
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
PDF
Fl Studio 24.2.2 Build 4597 Crack for Windows Free Download 2025
faizk77g
 
PDF
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
PPTX
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
PDF
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
PDF
NewMind AI - Journal 100 Insights After The 100th Issue
NewMind AI
 
PDF
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
PDF
Timothy Rottach - Ramp up on AI Use Cases, from Vector Search to AI Agents wi...
AWS Chicago
 
PPTX
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
The Builder’s Playbook - 2025 State of AI Report.pdf
jeroen339954
 
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
MSP360 Backup Scheduling and Retention Best Practices.pptx
MSP360
 
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
Fl Studio 24.2.2 Build 4597 Crack for Windows Free Download 2025
faizk77g
 
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
NewMind AI - Journal 100 Insights After The 100th Issue
NewMind AI
 
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
Timothy Rottach - Ramp up on AI Use Cases, from Vector Search to AI Agents wi...
AWS Chicago
 
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 

Intro to ruby

  • 1. Intro to Ruby Women Who Code Belfast [email protected] : hcampbell07 : heatherjcampbell.com
  • 3. • Everything is an Expression • Everything is an Object • Supports Dynamic Reflection
  • 5. current_count = 5 final_salary = 30000.00 Snake Case Readable
  • 8. str.upcase vs str.upcase! Create New vs Modify Existing
  • 9. io.rb print “Enter your name: ” name = gets puts name.strip + “ is learning Ruby” Input / Output
  • 10. [4,2,3,5].sort.map{ |e| e * e}.join(',') # "4,9,16,25" Method Chaining
  • 11. • Write some code to ask a user to input a number. Take the number multiply it by 10 and display it back to the user • Find a method to capitalize a string • Check the class of 1. (using the .class method) then find a method to check if the number is even Exercises
  • 12. TYPES
  • 14. 1.class # Fixnum 1111111111.class # Bignum Fixnum.superclass # Integer Bignum.superclass # Integer 111_000_000.class # Fixnum 1.2345.class # Float Numbers
  • 15. String.method.count # Lots of helpful methods! "Ruby" * 4 # "RubyRubyRubyRuby" "Ruby" + " " + "Ruby" # "Ruby Ruby" a = "I don’t know Ruby" a*"don’t"+ = "do" # "I do know Ruby" String
  • 16. number_of_girls = 4 number_of_boys = 6 puts "number of girls #{number_of_girls}" puts "number of boys #{number_of_boys}" puts "number of people #{number_of_boys + number_of_girls}" Interpolation
  • 17. phone = "(028 90)454 545" phone.gsub!(/D/, "") puts "Phone Number : #{phone}" # "02890454545" puts "Heather Campbell".gsub(/([a-zA-Z]+) ([a-zA-Z]+)/, "2, 1") # "Campbell, Heather" Regex
  • 18. attr_accessor :driver :small :medium :large a = :small b = :small a.object_id == b.object_id # true :small.to_s # "small " "small".to_sym # :small Symbols
  • 19. arr = [1,2,'three', :big] arr.size # 4 arr.empty? # false arr[1] # 2 arr[-1] # :big arr[1..3] # [2,'three', :big] arr[4..5] = [:east, :west] # [1,2,'three', :big, :east, :west] arr << 10 # [1,2,'three', :big, :east, :west,10] Arrays
  • 20. [1,2,3].map { |e| e * e} # [1,4,9] [2,2,3].reduce{|total,v| total * v} # 12 ['act', 'bat', 'them'] .all? { |w| w.length >= 3 } # true Enumerable
  • 21. h = {'France' => 'Paris', 'Ireland' => 'Dublin' } h = {France: 'Paris', Ireland: 'Dublin' } h[:France] # 'Paris‘ h[:Italy] = 'Rome' # h = {France: 'Paris', Ireland: 'Dublin', Italy: # 'Rome' } h.each {|k,v| puts "key: #{k} t value: #{v}"} h.any? { |k,v| v == 'Rome' } Hashes
  • 22. (1..5).each{|v| p v} # 1,2,3,4,5 (1…5).each{|v| p v} # 1,2,3,4 (10..20).include?(19) # true (2..5).end # 5 ("aa".."ae").each{|v| p v} # "aa","ab","ac","ad","ae" Ranges
  • 23. def get_values; [1,2,3,4]; end; first, _, _, last = get_values # first = 1, last = 4 a, *b, c = get_values # a = 1, b = [2,3],c = 4 r = (0..5) a = [1,2,*r] # a = [1,2,0,1,2,3,4,5] Splat Operator
  • 24. • • Separate an array [1,2,3,4] into 2 variables one holding the head of the array (i.e 1) and the other the rest of the array [2,3,4] Create a hash of months and days in a month e.g. {January: 31, ..}. For each month print out the month name and number of days. Then print out totals days in year by summing the hashes values Exercises
  • 26. if mark > 75 report = "great" elsif mark > 50 report = "good" else report = "needs work" end report = if mark > 75 then "great" elsif mark > 50 then "good" else "needs work" end if else
  • 28. speed = 60 limit = 40 speed > limit ? puts("Speeding!") : puts("Within Limit") ternary operator
  • 29. mark = 42 && mark * 2 # translates to mark = (42 && mark) * 2 mark = 42 and mark * 2 # returns 84 post = Posts.locate(post_id) and post.publish # publishes post if it is located if engine.cut_out? engine.restart or enable_emergency_power end and / or
  • 30. grade = case mark when 90..100 "A" when 70..89 "B" when 60..69 "C" when 50..59 "D" when 40..49 "E" else "F" end case unit when String puts "A String!" when TrueClass puts "So True!" when FalseClass puts "So False!" end case
  • 31. while count < max puts "Inside the loop. count = #{count}" count +=1 end puts "count = #{count += 1}" while count < max while
  • 32. until count > max puts "Inside the loop. count = #{count}" count +=1 end array = [1,2,3,4,5,6,7] array.pop until array.length < 3 until
  • 33. begin puts "Inside the loop. count = #{count}" count +=1 end while count < max looping block
  • 34. for count in (1..10) puts "Inside the loop: count = #{count}" end for
  • 35. animals = {cat: "meow ", cow: "moo "} animals.each do |k,v| puts "The #{k} goes #{v}" end animals = {cat: "meow ", cow: "moo "} animals.each {|k,v| puts "The #{k} goes #{v} "} iterators
  • 36. magic_number = 5; found = false; i = 0; input = 0; while i < 3 print "Please enter a number between 1 and 10: " input = gets.to_i unless input.between?(1,10) print "invalid number"; redo end if input == magic_number found = true; break end i += 1 end found ? put "found! " : put " bad luck " flow control
  • 37. def display_content(name) f = File.open(name, 'r') line_num=0 # raise 'A test exception.' f.each {|line| print "#{line_num += 1} #{line}"} rescue Exception => e puts "ooops"; puts e.message; puts e.backtrace else puts "nSuccessfully displayed!" ensure if f then f.close; puts "file safely closed"; end end exception handling
  • 38. def get_patients() patients = API.request("/patients") rescue RuntimeError => e attempts ||= 0 attempts += 1 if attempts < 3 puts e.message + ". Retrying request. “ retry else puts "Failed to retrieve patients" raise end end exception handling
  • 39. • • • • Write some conditional logic to capitalize a string if it is not in uppercase Print out your name 10 times Print the string “This is sentence number 1” where the number 1 changes from 1 to 10 Write a case statements which outputs “Integer” if the variable is an integer, “Float” if it is a floating point number or else “don’t know!” Exercises
  • 41. class Vehicle def drive(destination) @destination = destination end end Classes
  • 42. class Vehicle attr_accessor :destination def drive(destination) self.destination = destination # do more drive stuff end end Accessors
  • 44. class Vehicle attr_accessor :colour, :make def initialize(colour, make) @make = make @colour = colour end end Constructor
  • 45. class SuperCar < Vehicle def drive(destination) self.destination = destination puts 'driving super fast' end end Inheritance
  • 46. class SuperCar < Vehicle attr_accessor :driver def drive(circuit, driver) self.destination = destination self.driver = driver puts 'driving super fast' end end Inheritance
  • 47. “If it walks like a duck and talks like a duck, it must be a duck” Duck Typing
  • 48. class Person def quack() puts 'pretends to quack' end end class Duck def quack() puts 'quack quack' end end Duck Typing
  • 49. def call_quack(duck) duck.quack end call_quack(Duck.new) # quack quack call_quack(Person.new) # pretends to quack Duck Typing
  • 50. class Vehicle class Vehicle def crash() explode end def crash() explode end private def explode() puts "Boom!" end end def explode() puts "Boom!" end private :explode end Method Visibility
  • 51. class SuperCar < Vehicle def explode() puts "Massive Boom!" end end Method Visibility
  • 52. result = class Test answer = 7+5 puts " Calculating in class: " + answer.to_s answer end puts "Output of the class: " + result.to_s Executable
  • 53. class Rocket …. end r = Rocket.new class Rocket def land() puts "Back on Earth" end end r.land Open Classes
  • 54. class String def shout self.upcase! self + "!!!" end def empty? true end end Monkey Patching
  • 55. a = "abc" b=a c = "abc" a.equal?(b) # true a.equal?(c) # false a == b # true a == c # true Equality
  • 56. • • • • • • Create a class to represent a Computer Create an instance of the Computer called computer Add a starting_up method Create a class WindowsComputer which inherits from Computer Create an instance of the WindowsComputer called wcomputer and call starting_up on it Alter WindowsComputer to allow the user to set a name value when they create an instance. Allow the user to set and get the name attribute Exercises
  • 58. # Java public Car() , …public Car(String make) { } public Car(String make, String model) { } public Car(String make, String model, String colour) { } # Ruby def initialize (make = :Ford, model = Car.get_default_model(make), colour = (make == :Ferrari ? 'red' : 'silver') ) … end Overloading Methods
  • 59. def create_car (make = :Ford, model = get_default_model(make), colour) … end create_car('red' ) Method Parameters
  • 60. def produce_student(name, *subjects) … end produce_student('June Black', 'Chemistry', 'Maths', 'Computing' ) subject_list = ['Chemistry', 'Maths', 'Computing'] produce_student('June Black', *subject_list) Variable Length Param List
  • 61. class Meteor attr_accessor :speed def initialize() @speed = 0 end def +(amt) @speed += amt end def -(amt) @speed > amt ? (@speed -= amt) : (@speed = 0) end end Operators
  • 62. class Roman def self.method_missing name, *args roman = name.to_s roman.gsub!("IV", "IIII") roman.gsub!("IX", "VIIII") roman.gsub!("XL", "XXXX") roman.gsub!("XC", "LXXXX") (roman.count("I") + roman.count("V") * 5 + roman.count("X") * 10 + roman.count("L") * 50 + roman.count("C") * 100) end end Method Missing
  • 63. handlers = { up_arrow: :tilt_up, down_arrow: :tilt_down, left_arrow: :turn_left, right_arrow: :turn_right} ship.__send__(handlers[input]) Send
  • 64. • • • • • • Alter the WindowsComputer class you created in the last exercise to make the name parameter optional Try creating an instance with and without a name value Add a mandatory attribute called owner to the class and alter initialize to set it. Try creating a new instance with no, 1 and 2 parameter values. What happens? add a method display_details to output the name and owner of the machine and try calling it using __send__ now make display_details private and try calling it directly and using __send__. Notice anything odd? Exercises
  • 66. def block_example puts 'Optional block example.' if block_given? yield "Heather" else puts 'No block. Very Empty' end puts 'End of example' end Blocks
  • 67. def with_timing start = Time.now if block_given? yield puts 'Time taken: #{Time.now - start}' end end Blocks
  • 68. def add_numbers(x, y) x+y end alter the above method to accept a block and execute it if one is supplied. Call it with a block to provide debug i.e. displaying the method name and values passed Exercises
  • 71. require 'minitest/autorun' require '../lib/People' class TestEmployee < MiniTest::Unit::TestCase def setup @employee = Employee.new end def test_employer assert_equal "Kainos", @employee.employer end end MiniTest
  • 72. require "minitest/autorun" describe Employee do before do @employee = Employee.new end describe "when asked for an employer" do it "must provide one" do @employee.employer.must_equal "Kainos" end end end MiniTest
  • 73. # bowling_spec.rb require 'bowling' describe Bowling, "#score" do it "returns 0 for all gutter game" do bowling = Bowling.new 20.times { bowling.hit(0) } bowling.score.should eq(0) end end RSpec
  • 74. # division.feature Feature: Division In order to avoid silly mistakes Cashiers must be able to calculate a fraction Scenario: Regular numbers * I have entered 3 into the calculator * I have entered 2 into the calculator * I press divide * the result should be 1.5 on the screen Cucumber
  • 75. #calculator_steps.rb Before do @calc = Calculator.new end Given /I have entered (d+) into the calculator/ do |n| @calc.push n.to_i end When /I press (w+)/ do |op| @result = @calc.send op end Cucumber
  • 76. Want to Learn More? Codecademy http://www.codecademy.com/tracks/ruby CodeSchool https://www.codeschool.com/paths/ruby Seven Languages in Seven Weeks pragprog.com/book/btlang/seven-languages-in-seven-weeks
  • 77. Want to Learn More? Programming Ruby pragprog.com/book/ruby/programming-ruby First edition available for free online at http://ruby-doc.com/docs/ProgrammingRuby/ Ruby Koans http://rubykoans.com Pluralsight

Editor's Notes

  • #4: sees everything as an object even things other languages represent as primitivesa = 4.5a.classString.public_methods.sortString.superclass
  • #8: b = [] b.empty? c = “” c.empty? c.nil?
  • #9: Dangerous a = “abcde” a.upcase a a.upcase! a
  • #15: readonly
  • #17: used a lot in Ruby. Cleaner and more performant than concatenation. Doesn’t require creation of multiple strings
  • #19: Global unique and immutable, good substitute for string where like label e.g. hash keys,
  • #20: can also + to join and *
  • #21: Close to 50 methods v powerful
  • #22: also includes enumerable module
  • #23: can also + to join and *
  • #24: works with any class with implements to_a method
  • #30: operators to control flow. Chaining events. and if this is true then do this. or like a fallback try this or try this
  • #35: tend to use each construct instead. Use with ranges
  • #36: tend to use each construct instead. Use with ranges
  • #37: break: exits out of loop. In this case because we’ve found number, redo repeats iteration without re-evaluating the loop conditionnext: starts next iteration of loop without completing the current loop
  • #38: rescue: handling if an exception occures, else: only executed if no error occurred, ensure: always executed…tidying up!
  • #39: making a call to web service to retrieve list of patients. Sometimes it temp is unavailable, allowed 3 attempts before failingnote conditional initialization of attempts
  • #42: vehicle = vehicle.newvehicle.drive(“Bangor”)puts vehicle.inspectp vehicleVehicle.methodsVehicle.instance_methodsVehicle.instance_methods(false)
  • #43: vehicle = vehicle.newvehicle.drive(“Bangor”)puts vehicle.inspectp vehicleVehicle.methodsVehicle.instance_methodsVehicle.instance_methods(false)
  • #44: read/write, read only, write only
  • #45: called on new
  • #46: Overridden method, same initialize method, same attributes
  • #47: Overridden method, same initialize method, same attributes
  • #48: What method it understands is key not it’s type or parents
  • #49: 2 v different classes both with a quack method
  • #50: Overridden method, same initialize method, same attributes
  • #51: instance variables/attributes private by defaultinstance methods public by defaultprivate / protectedprivate can be called by subclasses. can’t be called with explicit object receiverprotected objs of sames class, obj with same ancestor if defined in the ancestor
  • #52: If you override method you need to explicitly set visibiliy again e.g. overridden explode method is public
  • #53: real uses are attr_accessor, private etc.http://ruby-doc.org/core-1.9.3/Module.html
  • #54: In Ruby, classes are never closed: you can always add methods to an existing class. This applies to the classes you write as well as the standard, built-in classes. All you have to do is open up a class definition for an existing class, and the new contents you specify will be added to whatever&apos;s there.
  • #55:  extend or modify the run-time code of dynamic languages without altering the original source code. (third party libs)Power use wisely. Just becase you can do something doesn’t mean you should do it. Unexpected behaviour, assumptions made in how you change it may not be valid as versions of class change
  • #59: Can’t do it! Same method name but different param lists. instead can have optional paramsdefault values, method calls, conditional logic. calculated at the point of method call
  • #62: Can override operators. use sparingly where it makes code more readable. can cause unexpected behaviour for user and be cryptic to read
  • #64: Methods sent as messages to object instance. Receives it and looks to see if method exists anywhere in hierarchy if it does calls method with provided parameters
  • #67: Piece of code between do and end (multiline) or { single line} which can be passed as an arg to certain methods
  • #68: Avoid boiler plate code like timing, transactions
  • #71: TDD write test first and then just enough code to make it pass then repeatBDD specialised version of TDD where tests are defined in a format that is meaningful to the business, in terms of domain