SlideShare a Scribd company logo
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Lecture 6 :

Introduction to Ruby
LSINF 2335
Programming Paradigms
Prof. Kim Mens
UCL / EPL / INGI
Partly inspired on :
• the pickaxe book “Programming Ruby” by Dave Thomas
• slides by Prof. Tom Mens (UMons)
• slides by Prof. Wolfgang De Meuter (VUB)
• an update to the slides made by Benoît Daloze (UCL)
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Lecture Overview
■ History of Ruby
■ Getting started with Ruby
■ The Ruby programming language
■ A worked-out example
■ Conclusion
2
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
What is Ruby?
■ Originally conceived by Yukihiro Matsumoto
– February 24, 1993, Japan
• first public release in 1995
• Feb 24, 2013: Ruby 2.0 release
– motivation:
• “wanted a scripting language [...] more powerful than Perl,
and more object-oriented than Python”
• wanted a natural and very expressive language in which
programmers can easily express themselves
– language named after a precious gemstone
• à la “Perl”
– is an open source project
3
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
What is Ruby?
■ Ruby is an interpreted, object-oriented,
dynamically typed programming language with
strong reflective and scripting facilities
– Compact syntax inspired by Python and Perl
– Semantics akin to dynamically class-based languages like
Smalltalk
– Scripting facilities akin to those of Python and Perl
• manipulation of text files
• file handling
• execution of system tasks
• support for regular expressions
• ... 4
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Ruby’s “killer app”
■ Ruby on Rails (a.k.a. “Rails” or “RoR”)
– Open-source web-application framework
– Implemented in Ruby
– Allows you to quickly create powerful web applications
– Based on model-view-controller pattern
– Web-application =
• Ruby program + database + webserver
5
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Scaffolding
■ “Scaffolding” in RoR is a particular use of meta-progamming to
construct database-backed web-applications
– essentially stub generation
■ [construction] : a temporary framework used to support people
and material in the construction or repair of large buildings
■ [programming] : a meta-programming technique for quickly
building software applications
– in RoR, rather than programming the application, the programmer specifies a
template from which the application code can be generated
• programmer specifies a template describing how the application
database may be used
• compiler uses this specification to generate application code
– to create, read, update and delete database entries
• template is a "scaffold" on which a more powerful application is built 6
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Lecture Overview
■ History of Ruby
■ Getting started with Ruby
■ The Ruby programming language
■ A worked-out example
■ Conclusion
7
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic. Getting started with Ruby
8
RUBY VERSION
Kim:~ kimmens$ ruby -v
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin10.8.0]
Kim:~ kimmens$ irb -v
irb 0.9.6(09/06/30)
SIMPLE COMMAND PROMPT EXAMPLES
Kim:~ kimmens$ irb
>> 3+4
=> 7
>> "Kim"+"Mens"
=> "KimMens"
PRINTING
>> puts "Hello World"
Hello World
=> nil
>> 3.times { puts "Ruby" }
Ruby
Ruby
Ruby
=> 3
irb = Interactive Ruby
puts is a standard Ruby
method that writes its argument(s)
to the console, adding a newline
after each.
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic. Getting started with Ruby
9
METHOD DEFINITIONS
>> def product(n1,n2)
>> n1 * n2
>> end
=> nil
>> product(3,4)
=> 12
>> def fib(n)
>> if n <= 1 then n
>> else fib(n-1) + fib(n-2)
>> end
>> end
=> nil
>> fib(1)
=> 1
>> fib(3)
=> 2
>> fib(5)
=> 5
>> fib(10)
=> 55
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
10
VARIABLES
>> a=1
=> 1
>> b=2
=> 2
>> a+b
=> 3
>> a = ""
=> ""
>> 3.times { a = a + "Ruby" }
=> 3
>> a
=> "RubyRubyRuby"
LOADING FROM FILE
>> require "./SINF2335/Ruby/FactorialProgram.rb"
51090942171709440000
=> true
def factorial(n)

result = 1

(2..n).each do |i|

result *= i

end

result

end



puts factorial(21)

Getting started with Ruby
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic. Making a Ruby script
11
①
1. create .rb file
2. put “shebang” on 1st line
3. make file executable
4. run it
③
④
②
chmod +x FirstRubyProgram.rb

./FirstRubyProgram.rb
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Lecture Overview
■ History of Ruby
■ Getting started with Ruby
■ The Ruby programming language
■ A worked-out example
■ Conclusion
12
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Ruby’s language features
■ Purely object-oriented (everything is an object)
■ Dynamically typed
■ Message passing is only control-structure
■ Single class based inheritance
■ Automatic garbage collection
■ Exception handling
■ First-class closures (blocks)
■ Reflective facilities
■ Features for program evolution (e.g., mixins)
■ Embedded scripting facilities (e.g. regular expressions)
■ In addition, it comes with a large standard library
13
Like Smalltalk
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Everything is an object
# Numbers :
1 77.0 -12 12.5e23
# Symbols :
:a :red
# Strings :
"HellonWorld", 'Hello World'
# Booleans :
true false 1 < 2
# Arrays :
[] [1,2,3] [1,true,"Hello"]
# Hashes (a.k.a. dictionaries):
{ :PGD => 18, :GD => 16, :D => 14, :S => 12 }
# Even nil is an object (that happens to represent nothing)
# Even a class is an object 14
42.class => Fixnum
:foo.class => Symbol
"Ruby".class => String
true.class => TrueClass
[1,2,3].class => Array
{ :a => 1 }.class => Hash
nil.class => NilClass
Fixnum.class => Class
Similar to Smalltalk.
No primitive types as in Java.
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Message passing
# Parameterless messages
"Ruby".reverse()
# Kernel messages with parameters
Kernel.print("Ruby")

Kernel.print("Ruby","Ruby","Ruby")
# Message chaining
"Ruby".reverse().upcase().length()
# Undefined method error
"Ruby".foo()
# Arithmetic operators
-12.abs()

4.+(5)

"Ruby".*(3)
15
Every message send produces a
result (or an error)
receiver.message(arg1,arg2,...,argn)
receiver can be dropped
for Kernel methods
parentheses are optional
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic. The Kernel
16
Kernel#!~
Kernel#<=>
Kernel#===
Kernel#=~
Kernel.Array
Kernel.Complex
Kernel.Float
Kernel.Hash
Kernel.Integer
Kernel.Rational
Kernel.String
Kernel.__callee__
Kernel.__dir__
Kernel.__method__
Kernel.`
Kernel.abort
Kernel.at_exit
Kernel.autoload
Kernel.autoload?
Kernel.binding
Kernel.block_given?
Kernel.caller
Kernel.caller_locations
Kernel.catch
Kernel#class
Kernel#clone
Kernel#define_singleton_method
Kernel#display
Kernel#dup
Kernel#enum_for
Kernel#eql?
Kernel.eval
Kernel.exec
Kernel.exit
Kernel.exit!
Kernel#extend
Kernel.fail
Kernel.fork
Kernel.format
Kernel#freeze
Kernel#frozen?
Kernel.gets
Kernel.global_variables
Kernel#hash
Kernel#inspect
Kernel#instance_of?
Kernel#instance_variable_defined?
Kernel#instance_variable_get
Kernel#instance_variable_set
Kernel#instance_variables
Kernel#is_a?
Kernel.iterator?
Kernel#kind_of?
Kernel.lambda
Kernel.load
Kernel.local_variables
Kernel.loop
Kernel#method
Kernel#methods
Kernel#nil?
Kernel#object_id
Kernel.open
Kernel.p
Kernel.print
Kernel.printf
Kernel#private_methods
Kernel.proc
Kernel#protected_methods
Kernel#public_method
Kernel#public_methods
Kernel#public_send
Kernel.putc
Kernel.puts
Kernel.raise
Kernel.rand
Kernel.readline
Kernel.readlines
Kernel#remove_instance_variable
Kernel.require
Kernel.require_relative
Kernel#respond_to?
Kernel.select
Kernel#send
Kernel.set_trace_func
Kernel#singleton_class
Kernel#singleton_methods
Kernel.sleep
Kernel.spawn
Kernel.sprintf
Kernel.srand
Kernel.syscall
Kernel.system
Kernel#taint
Kernel#tainted?
Kernel#tap
Kernel.test
Kernel.throw
Kernel#to_enum
Kernel#to_s
Kernel.trace_var
Kernel.trap
Kernel#trust
Kernel#untaint
Kernel.untrace_var
Kernel#untrust
Kernel#untrusted?
Kernel.warn
To get these just type
Kernel.methods at the prompt
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Shorthand notation
# Parameterless messages
"Ruby".reverse

"Ruby".foo
# Messages with parameters
print "Ruby"

print "Ruby", "Ruby", "Ruby"

print("Ruby", "Ruby", "Ruby")

Message chaining
"Ruby".reverse.upcase.length
# Arithmetic operators
-12.abs

4 + 5

"Ruby" * 3
17
To avoid the problem of knowing
what argument goes with what
method call, use parentheses...
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Method naming conventions
# Predicate methods end by “?”
0.zero?

[1,2,3].include? 2
# Destructive methods by “!”
a = "Ruby"

a.reverse!
# For many destructive methods there is also a non-destructive variant
# Conversion methods start by to_
40.to_s.reverse

"40".to_i

(1..3).to_a
# Method names (usually) start with a lowercase letter
18
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Control structures
19
postfix notation :
if <cond>
<body>
elsif <cond>
<body>
else
<body>
end
while <cond>
<body>
end
<expression> while <cond>
<expression> if <cond>
<expression> unless <cond>
<expression> until <cond>
until <cond>
<body>
end
In Ruby, only nil and false do not
represent the truth in conditions
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Object creation
■ Ex-nihilo
– literal objects are created by writing them down without
an explicit constructor message
■ Instance creation method
– To create objects from classes
• Array.new, Hash.new, ComplexPolar.new(r,teta)
■ Initialize method
– initializes instance variables upon object creation
– is called by new, passing all parameters that were passed
to new
20
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Class definition
class ComplexCartesian



# Constructor method

def initialize(x,y)

@x = x # Instance variable

@y = y # Instance variable

end



# Method definitions

def r

Math.sqrt(@x**2 + @y**2)

end



def theta

Math.atan2(@y, @x)

end



end

# Instance creation

c = ComplexCartesian.new(1,2)

# Using the instance

puts c.r
21
Attention:
@x is an instance variable

(‘@’ is part of its name)
x is a normal variable
No separators for statements.
Each statement on a separate line.
Indentation is not significant.
No need to explicitly declare
instance variables
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Scoping and naming of Variables
■ Syntax:
– Global variables (globally visible)
$pi
– Class variables (same for all instances)
@@epsilon
– Instance variables (unique for each instance)
@x, @y
– Local (local to a method)
temp = y/x
– Block (parameters of a block)
{ |entry| entry * entry }
■ Rules:
– Variable names start with lowercase
– Constants start with uppercase and so most class and module names!
22
Variables are dynamically typed.
Variables don’t contain values
but pointers to objects (like in
Java or Smalltalk)
Global and class variables are
not often used.
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Accessor methods
class ComplexCartesian



...



# Getter methods

def x

@x

end



def y

@y

end



# Setter methods

def x=(new_x)

@x = new_x

end



def y=(new_y)

@y = new_y

end



end
23
# Constructor method

def initialize(x,y)

@x = x 

@y = y 

end



# Method definitions

def r

Math.sqrt(x**2 + y**2)

end



def theta

Math.atan2(y,x)

end
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Accessor methods shorthand
class ComplexCartesian



...



attr_reader :x, :y

















attr_writer :x, :y

















end
24
attr_accessor :x, :y
or simply:
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Access control
■ Ruby provides 3 levels of access control for methods
– checked at run-time, not statically
1. public
• can be called by anyone
• default when nothing is specified
2. protected
• can be called by any object of the defining class and its
subclasses, very rarely used
3. private
– only on implicit receiver ( meth(arg), not self.meth(arg) )
25
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Accessor methods
class ComplexCartesian



# public by default

# Getter methods

def x

@x

end



def y

@y

end



private

# Setter methods

def x=(new_x)

@x = new_x

end



def y=(new_y)

@y = new_y

end



#everything remains private here until declared otherwise

end
26
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Arrays, variables & side-effects
[12,46,35].max # => 46

[12,46,35].reverse # => [35, 46, 12]


list = [7,4,1] # => [7, 4, 1]

list.sort # => [1, 4, 7]

list # => [7, 4, 1]

list.sort! # => [1, 4, 7]

# has destructively modified list:

list # => [1, 4, 7]

list.reverse! # => [7, 4, 1]

# has destructively modified list


[ 1, 2 ] << "c" << "d" << [ 3, 4 ]

# => [1, 2, "c", "d", [3, 4]]
27
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Blocks
■ Blocks are “chunks of code”
– that can be passed to a method
– not really first-class functions
• but Ruby also has a notion of Procs which are first class objects (see later)
■ Examples
3.times { print "Ruby" } # prints 'Ruby' 3 times

3.times do print "Ruby" end # alternative syntax



['I', 'like', 'Ruby'].each do |entry| # using block to iterate

print entry, ' ' # over a collection

end

[1,2,3,4,5].map { |entry| entry * entry }
# => [1, 4, 9, 16, 25]



fact = 1

1.upto(5) { |i| fact *= i }

fact
Similar in usage to
Smalltalk blocks
(though not exactly the same)
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Yielding blocks
■ Blocks are chunks of code that can be passed to
methods
– for example to implement iterators
■ Those methods can execute that block when needed
– by using the yield keyword
29
def say_something

yield("I", "like")

yield("We all", "love")

end



say_something do |person, verb| 

puts "#{person} #{verb} Ruby"

end
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Blocks and scoping
■ Block parameters are local to the block.
30
a = [1, 2, 3]

a.each { |i| puts i }

i # => NameError: undefined local variable or method `i'
a = [1, 2, 3]

i = 42

a.each { |i| puts i }

i # => 42
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Strings
■ Double quoted strings
– can contain special characters
"RubynRubynRubyn"
– and support expression extrapolation
"Good night, #{name}" 

"Good night, #{name.capitalize}"

"#{$greeting}, #{@name}"
– and find-and-replace primitives
x = "RubynRubynRubyn"

x["Ruby"] = "Dear"

x => "DearnRubynRubyn"
– transform string into array of strings by line breaks
x.lines.to_a
– convert array of strings back in string with line breaks
x.join
31
Substitutes expression
#{expr} in the string by
its value converted by
to_s
Difference between
'...' and "..." is the
amount of processing
Ruby does on the string.
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
String manipulation
■ Break up a single string into an array
"RubynRubynRubyn".split("n")
■ Join an array of strings into a single string
["Ruby", "Ruby", "Ruby"].join("n")
■ Remove extra spaces before and at the end of a string
" Hello there ".strip # => "Hello there"
■ Arithmetic operators on strings
"Ruby" * 3 # => "RubyRubyRuby"
■ And many, many, many more:

upcase, capitalize, center, chars, chomp, end_with?, (g)sub, scan, ...
32
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Regular expressions
■ notation: /pattern/
/this|that/ # matches either 'this' or 'that'

/th(is|at)/ # use of parens in patterns

/ab+c/ # matches 'a', then one or more 'b', then 'c'

/ab*c/ # matches 'a', then zero or more 'b', then 'c'

/sdw./ # for whitespace, digit, character in word,

any character
■ matching
line =~ /this|that/ # matches string with pattern

line.sub(/this|that/, 'foo') # replaces first occurrence

line.gsub(/this|that/, 'foo') # replaces every occurrence
■ regular expressions are objects too
/this|that/.class # => Regexp
33
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Functional side: simplify the loops!
def factorial(n)



# traditional loop

fact = 1

for i in (1..n)

fact *= i

end

return fact



# becomes

(1..n).inject(1) { |fact, i| fact * i }



# or even

(1..n).inject(1, :*)



end



factorial(5) # => 120

34
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Sinatra, a simple web DSL
require 'sinatra'



get '/' do

"Hello, World!"

end
$ curl localhost:4567 # => Hello, World!
35
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Scripting, set mtime from exiftime
■ A simple script to set the modification time of a
JPG picture from its “time of capture”
#!/usr/bin/env ruby

Dir["**/*.{jpg,JPG}"].each do |picture|

times = `exiftime #{picture}`

.scan(/(?:d+:d+:d+ ?){2}/)

.map { |time| Time.new(*time.split(/W/) }



unless times.all? { |time| time == times.first }

raise "Not same times: #{times}"

end

File.utime(File.atime(picture), times.first, picture)

end





36
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Lecture Overview
■ History of Ruby
■ Getting started with Ruby
■ The Ruby programming language
■ A worked-out example
■ Conclusion
37
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic. Complex numbers in Ruby
Cartesian coordinates
38
class ComplexCartesian



EPSILON = 0.00000001



def initialize(x,y)

@x, @y = x, y

end



private

attr_writer :x, :y



public

attr_reader :x, :y



def r

@r ||= Math.hypot(x, y)

end



...
# Class definition
# Constant
# Initialize instance vars
# Use of Math module
# Parallel declaration
# Private methods from here
# Setter methods
# Public methods from here
# Getter method
# Getter method with lazy
initialization
@r ||= expr

is shorthand for

@r = @r || expr

which is shorthand for
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
39
class ComplexCartesian

...



def theta

@theta ||= Math.atan2(y,x)

end



def to_s

"#{x} + #{y}i"

end



def to_cartesian

self # nothing needs to be done

end



def to_polar

ComplexPolar.new(r, theta)

end



...
# Conversion method to string
# self refers to receiving
object
Complex numbers in Ruby (ctd.)
Cartesian coordinates
# Note the use of expression
extrapolation
to_s is called by Ruby
automatically whenever it
wants to print an object
# Instance creation
# More conversion methods
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
40
class ComplexCartesian

...



def ==(c)

same?(x, c.x) and same?(y, c.y)

end



private

def same?(x, y)

(x - y).abs < EPSILON

end 



public

def +(c)

ComplexCartesian.new(self.x + c.x, self.y + c.y)

end



def *(c)

ComplexPolar.new(self.r * c.r, self.theta + c.theta)

end



...

end
# Equality method
# Auxilary method (private)
# Arithmetic operators
Complex numbers in Ruby (ctd.)
Cartesian coordinates
# Public methods again
# Use of constant
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
41
class ComplexPolar < ComplexCartesian



def initialize(r, theta)

@r, @theta = r, theta

end



def x

@x ||= @r * Math.cos(@theta)

end



def y

@y ||= @r * Math.sin(@theta)

end



private

attr_writer :r, :theta



public

attr_reader :r, :theta



...

# Inheritance
Complex numbers in Ruby
Polar coordinates
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
42
class ComplexPolar < ComplexCartesian

...



# to_s

# arithmetic operators

# private def same?(x,y)



def to_cartesian

ComplexCartesian.new(x,y)

end



def to_polar

self

end



def ==(c)

same?(r, c.r) and same?(theta, c.theta)

end



end
# Inherited methods
# Overridden method
Complex numbers in Ruby (ctd.)
Polar coordinates
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
43
require 'test/unit'

class TC_ComplexTest < Test::Unit::TestCase



def setup

@cc = ComplexCartesian.new(1, 1)

@cp = ComplexPolar.new(Math.sqrt(2), Math::PI / 4)

...

end



def test_self_comparison

assert_equal @cc, @cc

assert_equal @cp, @cp

end



def test_comparison_polar

assert_equal @cp, @cc.to_cartesian

assert_equal @cp, @cc.to_polar

end



def test_addition

assert_equal ComplexCartesian.new(2, 2), @cp + @cp

end



...

end
Complex numbers in Ruby
Unit testing
# import Test::Unit module
# define test class
# setup infrastructure
# test methods
# assert equality
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
44
require 'rspec'

describe 'Complex numbers' do

let :cartesian do

ComplexCartesian.new(1, 1)

end

let :polar do

ComplexPolar.new(Math.sqrt(2), Math::PI / 4)

end



it 'is identical to itself' do

cartesian.should == cartesian

polar.should == polar

end



it 'can be converted to the other type and still be equal' do

polar.to_cartesian.should == cartesian

cartesian.to_polar.should == polar

end



it 'supports addition' do

(cartesian + cartesian).should == ComplexCartesian.new(2, 2)

end



...

end
Complex numbers in Ruby
Behavioral testing with RSpec
# import RSpec gem
# define example group
# setup infrastructure
# example
# in natural order
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Lecture Overview
■ History of Ruby
■ Getting started with Ruby
■ The Ruby programming language
■ A worked-out example
■ Conclusion
45
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
■ Ruby has become a popular language
■ Very low-entry cost
– read-eval-print loop (irb, pry)
– plug-and-play
■ Easy digestible and readable syntax
■ Extensive libraries: Rubygems
■ Very powerful (compared to other main-stream applications)
■ “Killer-app”: Ruby-on-Rails
■ Advanced reflective and meta-programming facilities
■ Advanced scripting facilities
Conclusion
46
LSINF2335:Prog.Paradigms:
Theory,Pract.andApplic.
Conclusion
■ Some negative points
– automatic declaration of instance variables
– often things can be done in many different ways
(alternative syntax, shorthand notations)
• can be seen as positive: use the one that works best for you
• can be seen as negative: need to be able to read the one
that doesn’t work best for you as well
– a method in a subclass can override its parent method’s
visibility rules
47
class Base 

def a_method 

puts "Got here" 

end 

private :a_method 

end
class Derived1 < Base 

public :a_method 

end 



class Derived2 < Base 

end

More Related Content

PPTX
Ruby Programming Language - Introduction
PDF
Ruby Presentation
PPTX
Ruby programming
PDF
Ruby on Rails Presentation
ODP
PDF
When To Use Ruby On Rails
PPT
PDF
Ruby on Rails Presentation
Ruby Programming Language - Introduction
Ruby Presentation
Ruby programming
Ruby on Rails Presentation
When To Use Ruby On Rails
Ruby on Rails Presentation

What's hot (20)

PPTX
PHP Presentation
PPTX
Introduction to php
PPTX
PHP slides
PDF
Introduction to HTML5
PPT
PHP - Introduction to Object Oriented Programming with PHP
PPTX
Ajax
PPT
Class 5 - PHP Strings
PDF
Xampp installation
PPT
Javascript Basics
PPT
Introduction to Javascript
PPTX
laravel.pptx
PPTX
Presentation of bootstrap
PDF
Let's Learn Ruby - Basic
PPTX
Files in php
PPT
Introduction To PHP
PPTX
Introduction to Node.js
PPT
Web development | Derin Dolen
PDF
Python programming : Files
PHP Presentation
Introduction to php
PHP slides
Introduction to HTML5
PHP - Introduction to Object Oriented Programming with PHP
Ajax
Class 5 - PHP Strings
Xampp installation
Javascript Basics
Introduction to Javascript
laravel.pptx
Presentation of bootstrap
Let's Learn Ruby - Basic
Files in php
Introduction To PHP
Introduction to Node.js
Web development | Derin Dolen
Python programming : Files
Ad

Similar to Introduction to Ruby (20)

PDF
Ruby an overall approach
ZIP
Meta Programming in Ruby - Code Camp 2010
PDF
IJTC%202009%20JRuby
PDF
IJTC%202009%20JRuby
PPTX
Ruby basics
KEY
Introduction to Ruby
PPT
Rapid Application Development using Ruby on Rails
PPT
WorkinOnTheRailsRoad
PPT
Workin ontherailsroad
PPTX
Ruby Basics
KEY
Ruby on Rails Training - Module 1
PDF
Ruby Metaprogramming - OSCON 2008
PDF
Workin On The Rails Road
PDF
Building Modern Applications in Ruby: Fast, Efficient, Versatile, and Cost-Ef...
PPTX
Why Ruby?
PPTX
Ruby for PHP developers
PDF
Ruby 101 && Coding Dojo
DOCX
Page List & Sample Material (Repaired)
PPTX
Ruby -the wheel Technology
PDF
Ruby — An introduction
Ruby an overall approach
Meta Programming in Ruby - Code Camp 2010
IJTC%202009%20JRuby
IJTC%202009%20JRuby
Ruby basics
Introduction to Ruby
Rapid Application Development using Ruby on Rails
WorkinOnTheRailsRoad
Workin ontherailsroad
Ruby Basics
Ruby on Rails Training - Module 1
Ruby Metaprogramming - OSCON 2008
Workin On The Rails Road
Building Modern Applications in Ruby: Fast, Efficient, Versatile, and Cost-Ef...
Why Ruby?
Ruby for PHP developers
Ruby 101 && Coding Dojo
Page List & Sample Material (Repaired)
Ruby -the wheel Technology
Ruby — An introduction
Ad

More from kim.mens (20)

PDF
Software Maintenance and Evolution
PDF
Context-Oriented Programming
PDF
Software Reuse and Object-Oriented Programming
PDF
Bad Code Smells
PDF
Object-Oriented Design Heuristics
PDF
Software Patterns
PDF
Code Refactoring
PDF
Domain Modelling
PDF
Object-Oriented Application Frameworks
PDF
Towards a Context-Oriented Software Implementation Framework
PDF
Towards a Taxonomy of Context-Aware Software Variabilty Approaches
PDF
Breaking the Walls: A Unified Vision on Context-Oriented Software Engineering
PDF
Context-oriented programming
PDF
Basics of reflection
PDF
Advanced Reflection in Java
PDF
Basics of reflection in java
PDF
Reflection in Ruby
PDF
Introduction to Smalltalk
PDF
A gentle introduction to reflection
PDF
Managing the Evolution of Information Systems with Intensional Views and Rela...
Software Maintenance and Evolution
Context-Oriented Programming
Software Reuse and Object-Oriented Programming
Bad Code Smells
Object-Oriented Design Heuristics
Software Patterns
Code Refactoring
Domain Modelling
Object-Oriented Application Frameworks
Towards a Context-Oriented Software Implementation Framework
Towards a Taxonomy of Context-Aware Software Variabilty Approaches
Breaking the Walls: A Unified Vision on Context-Oriented Software Engineering
Context-oriented programming
Basics of reflection
Advanced Reflection in Java
Basics of reflection in java
Reflection in Ruby
Introduction to Smalltalk
A gentle introduction to reflection
Managing the Evolution of Information Systems with Intensional Views and Rela...

Recently uploaded (20)

PPTX
DRUG THERAPY FOR SHOCK gjjjgfhhhhh.pptx.
PPTX
Comparative Structure of Integument in Vertebrates.pptx
PPTX
GEN. BIO 1 - CELL TYPES & CELL MODIFICATIONS
PDF
HPLC-PPT.docx high performance liquid chromatography
PDF
The scientific heritage No 166 (166) (2025)
PPTX
INTRODUCTION TO EVS | Concept of sustainability
PDF
Sciences of Europe No 170 (2025)
PPTX
microscope-Lecturecjchchchchcuvuvhc.pptx
PPTX
2. Earth - The Living Planet earth and life
PPTX
famous lake in india and its disturibution and importance
PDF
VARICELLA VACCINATION: A POTENTIAL STRATEGY FOR PREVENTING MULTIPLE SCLEROSIS
PDF
Biophysics 2.pdffffffffffffffffffffffffff
PPTX
TOTAL hIP ARTHROPLASTY Presentation.pptx
PPTX
2. Earth - The Living Planet Module 2ELS
PPTX
7. General Toxicologyfor clinical phrmacy.pptx
PPTX
neck nodes and dissection types and lymph nodes levels
PPTX
cpcsea ppt.pptxssssssssssssssjjdjdndndddd
PDF
MIRIDeepImagingSurvey(MIDIS)oftheHubbleUltraDeepField
PPTX
ognitive-behavioral therapy, mindfulness-based approaches, coping skills trai...
PPTX
Classification Systems_TAXONOMY_SCIENCE8.pptx
DRUG THERAPY FOR SHOCK gjjjgfhhhhh.pptx.
Comparative Structure of Integument in Vertebrates.pptx
GEN. BIO 1 - CELL TYPES & CELL MODIFICATIONS
HPLC-PPT.docx high performance liquid chromatography
The scientific heritage No 166 (166) (2025)
INTRODUCTION TO EVS | Concept of sustainability
Sciences of Europe No 170 (2025)
microscope-Lecturecjchchchchcuvuvhc.pptx
2. Earth - The Living Planet earth and life
famous lake in india and its disturibution and importance
VARICELLA VACCINATION: A POTENTIAL STRATEGY FOR PREVENTING MULTIPLE SCLEROSIS
Biophysics 2.pdffffffffffffffffffffffffff
TOTAL hIP ARTHROPLASTY Presentation.pptx
2. Earth - The Living Planet Module 2ELS
7. General Toxicologyfor clinical phrmacy.pptx
neck nodes and dissection types and lymph nodes levels
cpcsea ppt.pptxssssssssssssssjjdjdndndddd
MIRIDeepImagingSurvey(MIDIS)oftheHubbleUltraDeepField
ognitive-behavioral therapy, mindfulness-based approaches, coping skills trai...
Classification Systems_TAXONOMY_SCIENCE8.pptx

Introduction to Ruby