際際滷

際際滷Share 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, Ei鍖el, Ada and LISP
 Includes a REPL
 Built for developers as a language they would love to use
 Dynamic, strict, re鍖ective, 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 鍖les
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 Gem鍖le
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"
Gem鍖le.lock
 When you initially install versions are saved to Gem鍖le.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?
 Di鍖erent projects might use di鍖erent versions of rails
 Di鍖erent projects might use di鍖erent ruby interpreters
 Ruby
 JRuby
 Rubinus
 While bundler helps, complete gem isolation is better!
 Its 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 鍖le per project allows you to say which ruby and gemset to use
 Should be in source control. Helps RVM users out, ignored for others
 Its a shell script thats executed everytime you cd (very unsafe)
 Makes life very easy however!
1 rvm use 1.9.2@saveingstar-web --create
7

More Related Content

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, Ei鍖el, Ada and LISP Includes a REPL Built for developers as a language they would love to use Dynamic, strict, re鍖ective, 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 鍖les 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 Gem鍖le 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" Gem鍖le.lock When you initially install versions are saved to Gem鍖le.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? Di鍖erent projects might use di鍖erent versions of rails Di鍖erent projects might use di鍖erent ruby interpreters Ruby JRuby Rubinus While bundler helps, complete gem isolation is better! Its 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 鍖le per project allows you to say which ruby and gemset to use Should be in source control. Helps RVM users out, ignored for others Its a shell script thats executed everytime you cd (very unsafe) Makes life very easy however! 1 rvm use 1.9.2@saveingstar-web --create 7