SlideShare a Scribd company logo
Ruby: Why We Love It
https://github.com/Kelsin/ruby-presentation
Christopher Giroir
November 8th, 2011
Contents
1 The Language 1
1.1 Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Why We Love It . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Gems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 Tools 6
2.1 Bundler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2 RVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1 The Language
1.1 Basics
Overview
• Inspired by Smalltalk (which I love)
• Also draws from Perl, Eiffel, Ada and LISP
• Includes a REPL
• Built for developers as a language they would love to use
• Dynamic, strict, reflective, object oriented
• Everything is an expression (even statements)
• Everything is executed imperatively (even declarations)
Object Oriented
• Everything is an object
• Single Inheritance
• Modules can be mixed in
• Dynamic Dispatch
1
Simple Code
1 5.times { print "Hello" }
This outputs:
1 Hello
2 Hello
3 Hello
4 Hello
5 Hello
6 => 5
Types
1 # Strings
2 s = ’Testing’
3
4 # Interpreted Strings
5 t = "Double #{str}"
6
7 # Symbols
8 sym = :chris
9
10 # Arrays
11 a = [1,2,3]
12
13 # Hashes
14 h = { :key => ’value’, :chris => ’awesome’ }
Classes
1 class Box
2 def initialize(w,h,d)
3 @width = w
4 @height = h
5 @depth = d
6 end
7
8 def volume
9 @width * @height * @depth
10 end
11 end
12
13 box = Box.new(2,2,2)
14 box.volume # => 8
Simple Inheritance
1 class JackInTheBox < Box
2 def initialize(msg)
3 @msg = msg
2
4 super(3,3,3)
5 end
6
7 def open
8 puts @msg
9 end
10 end
11
12 jbox = JackInTheBox.new(’Surprise!’)
13 jbox.volume # => 27
14 jbox.open # prints ’Surprise!’
Control
1 while true == false
2 if var == 5
3 break
4 end
5
6 begin
7 var - 1
8 end while var < 4
9
10 next if var == 6
11 end
Blocks
1 [1,2,3].each { |n| puts n }
This outputs:
1 1
2 2
3 3
4 => [1,2,3]
Block Syntax
1 5.upto(10) { |n| puts n }
This is exactly the same as the following:
1 5.upto(10) do |n|
2 puts n
3 end
1.2 Why We Love It
Attribute Methods
3
1 class Person
2 def name
3 @name
4 end
5 def social=(s)
6 @social = s
7 end
8 def age
9 @age
10 end
11 def age=(a)
12 @age = a
13 end
14 end
The Easy Way
1 class Person
2 attr_reader :name
3 attr_writer :social
4 attr_accessor :age
5 end
The Easy Way Explained
1 class Person
2 attr_reader :name
3 attr_writer :social
4 attr_accessor :age
5 end
• Ruby syntax allows method calls without ()
• Result is clean and looks like a language feature
• We can implement this ourselves
• Untested code, please do not copy:
1 class Object
2 def self.attr_reader(var)
3 class_eval <<-METHODS
4 def #{var}
5 @#{var}
6 end
7 METHODS
8 end
9 end
Why Blocks
1 (map (lambda (n)
2 (+ n 5))
3 ’(1 2 3))
4
Becomes:
1 [1,2,3].map do |n|
2 n + 5
3 end
Results in:
1 => [6,7,8]
1.3 Gems
Modules
1 module Voice
2 def say(msg)
3 puts msg
4 end
5 end
6
7 class Person
8 include Voice
9 end
10
11 p = Person.new
12 p.say(’Hello’) # prints ’Hello’
Using Gems
Require loads in files
1 require ’saver’ # pulls in ’saver.rb’
Gems allow us to not deal with paths
1 require ’rubygems’
2 require ’saver’
3
4 class Item
5 include Saver
6 end
Writing Gems
1 Gem::Specification.new do |s|
2 s.name = "saver"
3 s.version = Saver::VERSION
4 s.authors = ["Christopher Giroir"]
5 s.email = ["kelsin@valefor.com"]
6 s.homepage = "http://kelsin.github.com/saver/"
7
8 s.files = ‘git ls-files‘.split("n")
9 s.require_paths = ["lib"]
10
11 s.add_dependency ’activesupport’, ’~> 3.0.0’
12 s.add_dependency ’mongo_mapper’
13 end
5
2 Tools
2.1 Bundler
Why Bundler?
• Many projects (i.e. rails apps) are not gems themselves
• They do have gem dependencies
• Easy way to install and keep track of these dependencies
• Making sure ONLY the proper gems are used
The Gemfile
1 source ’http://tools1.savewave.com/rubygems’
2 source ’http://rubygems.org’
3
4 gem ’rails’, ’3.0.7’
5
6 gem ’sw-model’, ’0.13.0’
7
8 group :development, :test do
9 gem "rspec"
10 end
Using Bundler
1 # Install the gems from the Gemfile
2 bundle install
3
4 # Update gems to new versions
5 bundle update
6
7 # Execute command with proper gems
8 bundle exec rake spec
In your ruby code
1 require "rubygems"
2 require "bundler/setup"
3 require "saver"
Gemfile.lock
• When you initially install versions are saved to Gemfile.lock
• After they are only updated on bundle update
• SHOULD be checked into version control
• Protects from version updates
6
2.2 RVM
Why RVM?
• Different projects might use different versions of rails
• Different projects might use different ruby interpreters
– Ruby
– JRuby
– Rubinus
• While bundler helps, complete gem isolation is better!
• It’s nice to keep your system ruby separate and not update it
Using RVM
1 # Install the default 1.9.2 ruby interpretor
2 rvm install 1.9.2
3
4 # Switch to using 1.9.2
5 rvm use 1.9.2
6
7 # List installed rubies
8 rvm list
RVM Gemsets
1 # Create a new gemset
2 rvm gemset create savingstar-web
3
4 # List gemsets
5 rvm gemset list
6
7 # Switch to a ruby and gemset together
8 rvm use 1.9.2@savingstar-web
.rvmrc
• A .rvmrc file per project allows you to say which ruby and gemset to use
• Should be in source control. Helps RVM users out, ignored for others
• It’s a shell script that’s executed everytime you cd (very unsafe)
• Makes life very easy however!
1 rvm use 1.9.2@saveingstar-web --create
7

More Related Content

PDF
Ruby projects of interest for DevOps
KEY
Week1
PDF
Ruby Tuesday May 22, 2012
KEY
tDiary annual report 2009 - Sapporo Ruby Kaigi02
PDF
Ruby Security the Hard Way
PDF
How to develop the Standard Libraries of Ruby?
PDF
20140918 ruby kaigi2014
PDF
OSS Security the hard way
Ruby projects of interest for DevOps
Week1
Ruby Tuesday May 22, 2012
tDiary annual report 2009 - Sapporo Ruby Kaigi02
Ruby Security the Hard Way
How to develop the Standard Libraries of Ruby?
20140918 ruby kaigi2014
OSS Security the hard way

What's hot (16)

PDF
20140419 oedo rubykaigi04
PDF
20140425 ruby conftaiwan2014
PDF
An introduction and future of Ruby coverage library
PDF
How to distribute Ruby to the world
PDF
The Future of Bundled Bundler
PPT
Rust Programming Language
PDF
The Future of library dependency manageement of Ruby
PPT
ApacheCon NA 2011 report
PDF
The Future of library dependency management of Ruby
PDF
Multithread Your Application
PDF
The Future of Dependency Management for Ruby
PDF
Crystal
PDF
20140925 rails pacific
PDF
Esoteric, Obfuscated, Artistic Programming in Ruby
PPTX
My month with Ruby
PDF
Ractor's speed is not light-speed
20140419 oedo rubykaigi04
20140425 ruby conftaiwan2014
An introduction and future of Ruby coverage library
How to distribute Ruby to the world
The Future of Bundled Bundler
Rust Programming Language
The Future of library dependency manageement of Ruby
ApacheCon NA 2011 report
The Future of library dependency management of Ruby
Multithread Your Application
The Future of Dependency Management for Ruby
Crystal
20140925 rails pacific
Esoteric, Obfuscated, Artistic Programming in Ruby
My month with Ruby
Ractor's speed is not light-speed
Ad

Similar to Ruby Presentation - Article (20)

PDF
Ruby Presentation
PDF
Ruby Presentation - Handout
KEY
Introducing Ruby
PDF
Ruby Presentation - Beamer
PDF
IJTC%202009%20JRuby
PDF
IJTC%202009%20JRuby
PDF
Ruby training day1
PPTX
Ruby basics
PPTX
Why Ruby?
PPT
WorkinOnTheRailsRoad
PPT
Workin ontherailsroad
PPTX
PDF
Workin On The Rails Road
ZIP
Meta Programming in Ruby - Code Camp 2010
PPT
Intro To Ror
PPTX
Ruby from zero to hero
PDF
Ruby an overall approach
PPTX
Day 1 - Intro to Ruby
PDF
Ruby on Rails
KEY
Ruby v cpp_preso
Ruby Presentation
Ruby Presentation - Handout
Introducing Ruby
Ruby Presentation - Beamer
IJTC%202009%20JRuby
IJTC%202009%20JRuby
Ruby training day1
Ruby basics
Why Ruby?
WorkinOnTheRailsRoad
Workin ontherailsroad
Workin On The Rails Road
Meta Programming in Ruby - Code Camp 2010
Intro To Ror
Ruby from zero to hero
Ruby an overall approach
Day 1 - Intro to Ruby
Ruby on Rails
Ruby v cpp_preso
Ad

Recently uploaded (20)

PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
Big Data Technologies - Introduction.pptx
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Spectral efficient network and resource selection model in 5G networks
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Empathic Computing: Creating Shared Understanding
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Unlocking AI with Model Context Protocol (MCP)
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Big Data Technologies - Introduction.pptx
The AUB Centre for AI in Media Proposal.docx
Review of recent advances in non-invasive hemoglobin estimation
Diabetes mellitus diagnosis method based random forest with bat algorithm
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Spectral efficient network and resource selection model in 5G networks
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Empathic Computing: Creating Shared Understanding
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
MYSQL Presentation for SQL database connectivity
Per capita expenditure prediction using model stacking based on satellite ima...
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
NewMind AI Monthly Chronicles - July 2025
NewMind AI Weekly Chronicles - August'25 Week I
Unlocking AI with Model Context Protocol (MCP)

Ruby Presentation - Article

  • 1. Ruby: Why We Love It https://github.com/Kelsin/ruby-presentation Christopher Giroir November 8th, 2011 Contents 1 The Language 1 1.1 Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 Why We Love It . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.3 Gems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2 Tools 6 2.1 Bundler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.2 RVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1 The Language 1.1 Basics Overview • Inspired by Smalltalk (which I love) • Also draws from Perl, Eiffel, Ada and LISP • Includes a REPL • Built for developers as a language they would love to use • Dynamic, strict, reflective, object oriented • Everything is an expression (even statements) • Everything is executed imperatively (even declarations) Object Oriented • Everything is an object • Single Inheritance • Modules can be mixed in • Dynamic Dispatch 1
  • 2. Simple Code 1 5.times { print "Hello" } This outputs: 1 Hello 2 Hello 3 Hello 4 Hello 5 Hello 6 => 5 Types 1 # Strings 2 s = ’Testing’ 3 4 # Interpreted Strings 5 t = "Double #{str}" 6 7 # Symbols 8 sym = :chris 9 10 # Arrays 11 a = [1,2,3] 12 13 # Hashes 14 h = { :key => ’value’, :chris => ’awesome’ } Classes 1 class Box 2 def initialize(w,h,d) 3 @width = w 4 @height = h 5 @depth = d 6 end 7 8 def volume 9 @width * @height * @depth 10 end 11 end 12 13 box = Box.new(2,2,2) 14 box.volume # => 8 Simple Inheritance 1 class JackInTheBox < Box 2 def initialize(msg) 3 @msg = msg 2
  • 3. 4 super(3,3,3) 5 end 6 7 def open 8 puts @msg 9 end 10 end 11 12 jbox = JackInTheBox.new(’Surprise!’) 13 jbox.volume # => 27 14 jbox.open # prints ’Surprise!’ Control 1 while true == false 2 if var == 5 3 break 4 end 5 6 begin 7 var - 1 8 end while var < 4 9 10 next if var == 6 11 end Blocks 1 [1,2,3].each { |n| puts n } This outputs: 1 1 2 2 3 3 4 => [1,2,3] Block Syntax 1 5.upto(10) { |n| puts n } This is exactly the same as the following: 1 5.upto(10) do |n| 2 puts n 3 end 1.2 Why We Love It Attribute Methods 3
  • 4. 1 class Person 2 def name 3 @name 4 end 5 def social=(s) 6 @social = s 7 end 8 def age 9 @age 10 end 11 def age=(a) 12 @age = a 13 end 14 end The Easy Way 1 class Person 2 attr_reader :name 3 attr_writer :social 4 attr_accessor :age 5 end The Easy Way Explained 1 class Person 2 attr_reader :name 3 attr_writer :social 4 attr_accessor :age 5 end • Ruby syntax allows method calls without () • Result is clean and looks like a language feature • We can implement this ourselves • Untested code, please do not copy: 1 class Object 2 def self.attr_reader(var) 3 class_eval <<-METHODS 4 def #{var} 5 @#{var} 6 end 7 METHODS 8 end 9 end Why Blocks 1 (map (lambda (n) 2 (+ n 5)) 3 ’(1 2 3)) 4
  • 5. Becomes: 1 [1,2,3].map do |n| 2 n + 5 3 end Results in: 1 => [6,7,8] 1.3 Gems Modules 1 module Voice 2 def say(msg) 3 puts msg 4 end 5 end 6 7 class Person 8 include Voice 9 end 10 11 p = Person.new 12 p.say(’Hello’) # prints ’Hello’ Using Gems Require loads in files 1 require ’saver’ # pulls in ’saver.rb’ Gems allow us to not deal with paths 1 require ’rubygems’ 2 require ’saver’ 3 4 class Item 5 include Saver 6 end Writing Gems 1 Gem::Specification.new do |s| 2 s.name = "saver" 3 s.version = Saver::VERSION 4 s.authors = ["Christopher Giroir"] 5 s.email = ["kelsin@valefor.com"] 6 s.homepage = "http://kelsin.github.com/saver/" 7 8 s.files = ‘git ls-files‘.split("n") 9 s.require_paths = ["lib"] 10 11 s.add_dependency ’activesupport’, ’~> 3.0.0’ 12 s.add_dependency ’mongo_mapper’ 13 end 5
  • 6. 2 Tools 2.1 Bundler Why Bundler? • Many projects (i.e. rails apps) are not gems themselves • They do have gem dependencies • Easy way to install and keep track of these dependencies • Making sure ONLY the proper gems are used The Gemfile 1 source ’http://tools1.savewave.com/rubygems’ 2 source ’http://rubygems.org’ 3 4 gem ’rails’, ’3.0.7’ 5 6 gem ’sw-model’, ’0.13.0’ 7 8 group :development, :test do 9 gem "rspec" 10 end Using Bundler 1 # Install the gems from the Gemfile 2 bundle install 3 4 # Update gems to new versions 5 bundle update 6 7 # Execute command with proper gems 8 bundle exec rake spec In your ruby code 1 require "rubygems" 2 require "bundler/setup" 3 require "saver" Gemfile.lock • When you initially install versions are saved to Gemfile.lock • After they are only updated on bundle update • SHOULD be checked into version control • Protects from version updates 6
  • 7. 2.2 RVM Why RVM? • Different projects might use different versions of rails • Different projects might use different ruby interpreters – Ruby – JRuby – Rubinus • While bundler helps, complete gem isolation is better! • It’s nice to keep your system ruby separate and not update it Using RVM 1 # Install the default 1.9.2 ruby interpretor 2 rvm install 1.9.2 3 4 # Switch to using 1.9.2 5 rvm use 1.9.2 6 7 # List installed rubies 8 rvm list RVM Gemsets 1 # Create a new gemset 2 rvm gemset create savingstar-web 3 4 # List gemsets 5 rvm gemset list 6 7 # Switch to a ruby and gemset together 8 rvm use 1.9.2@savingstar-web .rvmrc • A .rvmrc file per project allows you to say which ruby and gemset to use • Should be in source control. Helps RVM users out, ignored for others • It’s a shell script that’s executed everytime you cd (very unsafe) • Makes life very easy however! 1 rvm use 1.9.2@saveingstar-web --create 7