Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ruby 2.0

Ruby 2.0

Short presentation covering some of the new features in Ruby 2.0.

Uģis Ozols

March 26, 2013
Tweet

More Decks by Uģis Ozols

Other Decks in Programming

Transcript

  1. module  StringPatch    refine  String  do        def

     is_number?            !!match(/^\d+$/)        end    end end   "1".is_number?  #  =>  undefined  method  `is_number?'  ...   using  StringPatch   "1".is_number?  #  =>  true "a".is_number?  #  =>  false Refinments
  2. $  ruby  string_patch.rb      string_patch.rb:2:  warning:  Refinements  are  experimental,

       and  the  behavior  may  change  in  future  versions  of  Ruby! Refinments
  3. module  A    def  foo;  puts  "A";  end end  

    class  B    include  A      def  foo;  puts  "B";  end end   klass  =  B.new klass.foo      #  =>  "B" B.ancestors  #  =>  [B,  A,  Object,  Kernel,  BasicObject] Module#prepend
  4. module  A    def  foo;  puts  "A";  end end  

    class  B    prepend  A  #  <-­‐  prepend  instead  of  include      def  foo;  puts  "B";  end end   klass  =  B.new klass.foo      #  =>  "A" B.ancestors  #  =>  [A,  B,  Object,  Kernel,  BasicObject] Module#prepend
  5. require  "active_support/core_ext/module/aliasing"   class  A    def  foo;  puts  "foo";

     end end   class  A    def  foo_with_bar        foo_without_bar        puts  "bar"    end      alias_method_chain  :foo,  :bar end   A.new.foo      #  =>  "foo  bar" A.ancestors  #  =>  [A,  Object,  Kernel,  BasicObject] Module#prepend
  6. class  A    def  foo;  puts  "foo";  end end  

    module  Extension    def  foo        super        puts  "bar"    end end   class  A    prepend  Extension end   A.new.foo      #  =>  "foo  bar" A.ancestors  #  =>  [Extension,  A,  Object,  Kernel,  BasicObject] Module#prepend
  7. def  link_to(name,  url_options  =  {},  html_options  =  {})    puts

     "name  =  #{name.inspect}"    puts  "url_options  =  #{url_options.inspect}"    puts  "html_options  =  #{html_options.inspect}" end   link_to("Ruby  1.9",  {},  {:class  =>  "styled-­‐link"}) #  name  =  "Ruby  1.9" #  url_options  =  {} #  html_options  =  {:class=>"styled-­‐link"} Keyword Arguments
  8. def  link_to(name,  url_options:  {},  html_options:  {})    puts  "name  =

     #{name.inspect}"    puts  "url_options  =  #{url_options.inspect}"    puts  "html_options  =  #{html_options.inspect}" end   link_to("Ruby  2.0",                :html_options  =>  {:class  =>  "styled-­‐link"}) #  name  =  "Ruby  2.0" #  url_options  =  {} #  html_options  =  {:class=>"styled-­‐link"} Keyword Arguments
  9. def  temperature(celsius,  fahrenheit:  to_fahrenheit(celsius))    puts  "#{celsius}°C"    puts  "#{fahrenheit}°F"

    end   def  to_fahrenheit(celsius)    celsius  *  9  /  5  +  32 end   temperature(36) #  36°C #  96°F Keyword Arguments
  10. Enumerable#lazy words  =  File.open('/usr/share/dict/words')            

               .map(&:chomp)                        .reject  {  |word|  word.length  <  4  }                        .take(10)   words  #  =>  ["aalii",  "Aani",  "aardvark",  ...] #  time  ruby  lazy.rb  ~  0.22s
  11. Enumerable#lazy words  =  File.open('/usr/share/dict/words')            

               .lazy  #  <-­‐-­‐  added  lazy  here                        .map(&:chomp)                        .reject  {  |word|  word.length  <  4  }                        .take(10)   words            #  =>  #<Enumerator::Lazy:  ...] words.to_a  #  =>  ["aalii",  "Aani",  "aardvark",  ...]   #  time  ruby  lazy.rb  ~  0.06s
  12. Enumerable#lazy require  "fruity"   range  =  1..100   compare  do

       without_lazy  {  range.          map  {  |el|  el  *  2  }  }    with_lazy        {  range.lazy.map  {  |el|  el  *  2  }.to_a  } end   #  Running  each  test  256  times. #  without_lazy  is  faster  than  with_lazy  by  4x  ±  0.1
  13. %i(foo  bar  baz)  #  =>  [:foo,  :bar,  :baz]   %I(foo

     b#{2+2}r  baz)  #  =>  [:foo,  :b4r,  :baz] %i and %I symbol literals
  14. #  Ruby  1.9 #  encoding:  utf-­‐8 #  without  ^  next

     line  will  throw  "invalid  multibyte  char  (US-­‐ ASCII)" name  =  "Uģis  Ozols" Default source encoding is UTF-8 #  Ruby  2.0 name  =  "Uģis  Ozols"
  15. Ruby  =  Struct.new(:version) ruby  =  Ruby.new("2.0")   ruby.to_h  #  =>

     {  :version  =>  "2.0"  } #to_h def  config(options)    if  options.respond_to?(:to_h)        #  consume  hash    else        raise  TypeErorr,  "Can't  convert  #{options.inspect}  into   Hash"    end end
  16. class  A    protected      def  foo    

       "A"    end end   klass  =  A.new klass.respond_to?(:foo)  #=>  false klass.respond_to?(:foo,  true)  #=>  true #respond_to? returns false for protected methods
  17. Rails  4.0.0.beta1  application   rails  g  scaffold  user  name  

    time  rake  test ~  12  seconds   time  rake  test ~  5  seconds #require optimizations Ruby  1.9.3-­‐p392 Ruby  2.0.0-­‐p0