An Introduction to Ruby
Speaker.new({
   :name            =>   "Wes Oldenbeuving",
   :twitter         =>   "@Narnach",
   :rubyist_since   =>   "Early 2006",
   :works_as        =>   "Freelance Rubyist",
   :code_at         =>   "github.com/Narnach",
   :email           =>   "wes@narnach.com"
})
Overview
What is Ruby?
History and current versions
What does Ruby look like?
Basic tools of the Rubyist
Practical uses of Ruby
The Ruby Community
What is Ruby?
Object oriented
Everything is an object
    1.class         # => Fixnum
    'a'.class       # => String
    :z.class        # => Symbol

    class Foo
    end
    Foo.class       # => Class
    Foo.new.class   # => Foo
Dynamically typed

   def foo(bar)
     bar * 2
   end
   foo(1)    # => 2
   foo("a") # => "aa"
Duck Typing


"a".respond_to? :size # => true
1.respond_to? :+      # => true
1.respond_to? :inject # => false
Scripting language
Everything is an expression
Ruby: the history
Japan
Idea
1993
Productivity and fun
Focus on the programmer,
    not the computer
Inspired by
Perl, Smalltalk, Lisp
v0.95
1995
English-language
      1999
      v1.3
Programming Ruby
      2000
Current versions of Ruby
Matz Ruby Interpreter
    Stable Ruby 1.8
Yet Another Ruby VM
 Development Ruby 1.9
JRuby (1.4)
Ruby 1.8 (1.9) on the JVM
Rubinius
Ruby 1.8 in Ruby
 (and a bit of C++)
IronRuby (0.9.2)
Ruby 1.8 without continuations
MacRuby (0.5)
Ruby 1.9 in Objective-C
Maglev
Ruby in Gemstone Smalltalk VM
Ruby: the language
What does Ruby look like?
Strings and Variables


'Hello, Devnology!'

name = 'Devnology'    # => "Devnology"
"Hello, #{name}!"     # => "Hello, Devnology!"
Methods
str = "Hello, Devnology!"
str.size                      # => 17
str.sub("Devnology", "World") # => "Hello, World!"

def greet(name="Wes")
  "Greetings, #{name}!"
end

puts   greet
puts   greet('Devnology')
# >>   Greetings, Wes!
# >>   Greetings, Devnology!
Numbers
1 + 2           #   =>   3
1 + 2.1         #   =>   3.1
2**10           #   =>   1024
9 / 2           #   =>   4
5 % 3           #   =>   2
-3.abs          #   =>   3
1.class         #   =>   Fixnum
(2**50).class   #   =>   Bignum
1.3.class       #   =>   Float
Arrays
Array.new           #   =>   []
[1,2,3]             #   =>   [1, 2, 3]
[1] + [2] << 3      #   =>   [1, 2, 3]
[1,2,3] - [2,3]     #   =>   [1]
%w[one two]         #   =>   ["one", "two"]
[1,2,3].pop         #   =>   3
[1,2].push(3)       #   =>   [1, 2, 3]
[1,2,3].shift       #   =>   1
[2,3].unshift(1)    #   =>   [1, 2, 3]
[1,3].insert(1,2)   #   =>   [1, 2, 3]
Hashes
options = {:name => "Devnology"}

h = Hash.new    # => {}
h['string'] = 1
h[:symbol] = 1
h               # => {:symbol=>1, "string"=>1}
h.keys          # => [:symbol, "string"]
h[:symbol]      # => 1
Iterators
for n in 0..2
  puts n
end

(0..2).each do |n|
  puts n
end

[0,1,2].each {|n| puts n}
Enumerable

ary = [1,2,3]
ary.map {|n| n * 2}                # => [2, 4, 6]
ary.select {|n| n % 2 == 0}        # => [2]
ary.inject(0) {|sum, n| sum + n}   # => 6
Control structures
   if some_condition
     # ...
   elsif other_condition
     # ...
   else
     # ...
   end

   while condition
     # ...
   end

   puts "lol" if funny?
Regular Expressions
str = "Hello, world!"
str.gsub(/[aeiou]/,"*")        #   =>   "H*ll*, w*rld!"
str =~ /w(or)ld/               #   =>   7
$1                             #   =>   "or"
match = str.match(/w(or)ld/)   #   =>   #<MatchData:
0x532cbc>
match[0]                       # => "world"
match[1]                       # => "or"
Error handling
begin
  raise "Standard error"
rescue => e
  p e
end
# >> #<RuntimeError: Standard error>

begin
  raise StandardError.new("Oh, oh")
rescue RuntimeError
  puts "runtime"
rescue StandardError
  puts "standard"
end
# >> standard
System interaction
system "ls"
output = `ls`

ARGV

File.open('test.txt','w') do |file|
  file.write("linen")
  file.puts("line")
end
File.read('test.txt')
Classes
class Calc
  attr_accessor :factor

  def initialize(factor=2)
    @factor = factor
  end

  def multiply(value)
    @factor * value
  end
end

calc = Calc.new
calc.multiply 5    # => 10
calc.factor = 3
calc.multiply 5    # => 15
Inheritance
class Foo
  def greet
    "Hi, #{value}"
  end
  def value
    "foo"
  end
end

class Bar < Foo
  def value
    "bar"
  end
end

Foo.new.greet # => "Hi, foo"
Bar.new.greet # => "Hi, bar"
Mixins & Open Classes
      module Even
        def even?
          self % 2 == 0
        end
      end

      class Fixnum
        include Even
      end

      1.even? # => false
      2.even? # => true
Class methods
 class Foo
   def self.bar
     "BAR!"
   end

   def bar
     "bar"
   end
 end

 Foo.bar     # => "BAR!"
 Foo.new.bar # => "bar"
Basic tools of a Rubyist
Rubygems
Rdoc
Interactive Ruby
Practical uses of Ruby
Ruby on Rails
class BlogPost < ActiveRecord::Base
  belongs_to :user
  has_many :comments

 validates_presence_of :user_id
 validates_associated :user

  validates_length_of :title, :within => 10..100
  validates_length_of :body, :within => 100..5000
end

BlogPost.new(:title => "Hello", :body => "foo!")
Rspec
it "should be awesome" do
  foobar = FooBar.new
  foobar.should be_awesome
end
Cucumber
Feature: Write blog post
  As a blogger
  I want to create a new blog post
  So that I can share my knowledge

  Scenario: Click   the Add group button
    Given I am on   the homepage
    When I follow   "New post"
    Then I should   be on the new blog post page


    Given /^I am on (.+)$/ do |page_name|
      visit path_to(page_name)
    end
Scripting / automation
DSL: Rake
desc "Clean everything up"
task :cleanup do
  Cleaner.cleanup!
end

desc "Make sure everything is shiny"
task :shiny => :cleanup do
  Shiner.polish!
end
DSL: Capistrano
set :application, "blog"
set :repository, "git@github.com:Narnach/#{application}.git"
set :deploy_to,   "/var/www/www.#{application}.com"

set :scm, :git

role :web, "server"
role :app, "server"
role :db, "server", :primary => true

namespace :deploy do
  desc "Restart Passenger"
  task :restart, :roles => :app, :except => { :no_release => true } do
    run "touch #{File.join(current_path,'tmp','restart.txt')}"
  end
end
The Ruby Community
Rubyists
Amsterdam.rb
Monthly beer night
Presentation nights
Utrecht.rb
Monthly beer night
rubyists.eu
ruby-groups.org
 dev-groups.org

An introduction to Ruby

Editor's Notes

  • #12 Overview: * Top-level: what is it? * Low-level: how does it look? * Purpose: What can you use it for? * Practice: what is it used for?
  • #29 Overview: * Top-level: what is it? * Low-level: how does it look? * Purpose: What can you use it for? * Practice: what is it used for?
  • #31 * Simple strings * Puts -&gt; global scope * Interpolation * Methods, parameters * Single quotes vs double quotes
  • #32 * Simple strings * Puts -&gt; global scope * Interpolation * Methods, parameters * Single quotes vs double quotes