The Joy Of Ruby
Upcoming SlideShare
Loading in...5

The Joy Of Ruby






Total Views
Views on SlideShare
Embed Views



6 Embeds 19 8 5 2 2 1 1



Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
Post Comment
Edit your comment

The Joy Of Ruby The Joy Of Ruby Presentation Transcript

  • The  Joy  of   Ruby Clinton  R.  Nixon,  Viget  Labs
  • Ruby  is  designed  to   make  programmers   happy.   –  Yukihiro  Matsumoto
  • Simplicity
  • a = "hello world" class String def no_vowels self.gsub(/[aeiou]/, '') end end p a.no_vowels # "hll wrld" Openness
  • Natural  Language case year when 1800...1900 then "19th century" when 1900...2000 then "20th century" else "21st century" end "word".include? "a" 5.times do paint.stir! end color "orange blossom" do red 224 yellow 147 blue 22 end
  • An  IntroducDon  to  Ruby
  • The  Ruby  Language Object-oriented Imperative Functional Dynamic Reflective
  • Basic  Types Integer (Fixnum, Bignum) 8192 Float 3.14159 String "3.14159" Symbol :corndog Array ["gala", "fuji"] Hash {:plums => 2, :pears => 7} Boolean false
  • Object-­‐Oriented 1.8.class # Float["a", "b", "c"]) # ["a", "b", "c"] true.is_a?(Object) # true true.class # TrueClass true.methods # ["==", "===", "instance_eval", "freeze", "to_a",
  • Modules,  Classes,  and  Objects module Authentication def valid_api_keys Database.retrieve_all_keys end def authenticated?(api_key) valid_api_keys.include? api_key end end class PublicAPI include Authentication def initialize(api_key) @api_key = api_key end def act if authenticated?(@api_key) do_a_thing end end end
  • Inheritance class PrivateAPI end include Authentication class PublicAPI def initialize(id, api_key) include Authentication @client = DB.get_client (id) def act @api_key = api_key if authenticated?(@api_key) end do_a_thing end def valid_api_keys end @client.api_keys end end class NewAPI < PublicAPI def act def act if authenticated? if authenticated?(@api_key) (@api_key) do_a_new_thing @client.do_a_thing end end end end end
  • The  Inheritance  Chain superclass Self Class Modules
  • Dynamic  &  Duck  Typing It’s not what type of object you have It’s what that object can do
  • Duck  Typing  in  AcDon class Rectangle <, :height) include Comparable def <=>(other) (self.width * self.height) <=> (other.width * other.height) end end r1 =, 10) r2 =, 7) r1 > r2 # => false
  • FuncDonal Ruby has broad support for functional programming But it’s not a functional language You could say it’s pragmatically functional
  • Blocks numbers = (1..10) { |n| n * n } # => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] numbers.reduce { |total, n| total += n } # => 55 odd_test = proc { |n| n % 2 == 1 } # => [1, 3, 5, 7, 9] def before_save(&block) @before_callbacks << block end
  • First-­‐class  FuncDons def counter(x = 0) proc { x += 1 } end next_num = counter # => 1 # => 2 # => 3 # => 4 another_seq = counter(10) # => 11
  • First-­‐class  FuncDons def is_prime?(x) is_prime = proc do |n, m| if m > (n / 2) true elsif n % m == 0 false else, m + 1) end end, 2) if x >= 2 end (1..23).select { |n| is_prime?(n) } # => [2, 3, 5, 7, 11, 13, 17, 19, 23]
  • ReflecDon (:AC, :THAC0).new.local_methods # => ["AC", "AC=", "THAC0", "THAC0=", # "[]", "[]=", "all?", "any?", ...] a = Rational(1, 2) a.instance_variables # => ["@denominator", "@numerator"] a.instance_variable_get("@numerator") # => 1
  • Metaprogramming module Accessors def access(var) define_method(var) do instance_variable_get("@#{var}") end define_method("#{var}=") do |val| instance_variable_set("@#{var}", val) end end end
  • Metaprogramming class Monster extend Accessors access :damage def initialize(damage) @damage = damage end end wampa ="2d6") wampa.damage # => "2d6" wampa.damage = "1d12"
  • The  Ruby  Ecosystem
  • Rails,  Rack,   and  Passenger
  • Merb Sinatra Ramaze Waves others Other  Web  Frameworks
  • Web  deployment set :application, 'listy' set :repository, "" set :scm, 'git' role :web, "" role :app, "" role :db, "", :primary => true set :user, "listy" set :deploy_to, "/home/listy/rails"
  • RubyGems Standard package management tool More like apt than CPAN Included with Ruby 1.9
  • Open  Source The Ruby License is much like the MIT License. Most Ruby gems are under the Ruby license or MIT License. GitHub is the hub of most Ruby OS activity.
  • Other  ImplementaDons JRuby IronRuby MacRuby and others
  • Ruby  Shared  Values
  • TesDng Rails was the first framework I used that came with testing built in. Community has exploded in the last few years with testing tools. It’s rare I see a project without tests.
  • ConvenDon  over  ConfiguraDon “The three chief virtues of a programmer are: Laziness, Impatience and Hubris.” – Larry Wall, who is not a Ruby programmer
  • Version  Control Everyone should use version control, so this isn’t really a value. But Ruby programmers are fanatics for their VCS. Git is the VCS of choice. Being distributed, it allows for easy public forks of projects, which has helped OS in Ruby.
  • Sharing Ruby programmers have been chastised as self-promoters. I don’t see that as a bad thing. We share everything: open source code, discoveries, tips and tricks. Talk, talk, talk Blog, blog, blog
  • Passion I don’t know any Ruby programmers who aren’t excited about programming.
  • Why  Ruby  Was  Right  For  Us (and  Might  Be  Right  For  You)
  • O"en  people,  especially  computer  engineers,   focus  on  the  machines.  They  think,  "By  doing   this,  the  machine  will  run  faster.  By  doing  this,   the  machine  will  run  more  effec>vely.  ..."  They   are  focusing  on  machines.  But  in  fact  we  need   to  focus  on  humans,  on  how  humans  care   about  doing  programming  or  opera>ng  the   applica>on  of  the  machines. –  Matz TranslaDon:  Ruby  is  not  so  fast.
  • ProducDvity Conventions and dynamism speed development. There are ridiculous quotes about “3-10x.” Personal observation: as a project goes on, it doesn’t get any harder, unlike other languages. Will testing slow you down?
  • Morale Anecdotally: people like to program in Ruby. Productive people are happier. Seeing instant results is very rewarding.
  • Broad  UDlity Text processing Cross-platform GUI development: Monkeybars, Limelight, and Shoes Server configuration management: Chef, Puppet, and Sprinkle Web servers: Mongrel, Unicorn, and Thin Testing other languages and anything else that isn’t matheletic
  • PlaYorm  AgnosDc MRI runs on Windows, OS X, Linux, and most other Unixes. JRuby runs anywhere Java will run. IronRuby is going to make .NET awesome. Passenger works with Apache. But you can proxy through or use FastCGI from any web server, even IIS.
  • QuesDons