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.

5cba606090e5f29f910274796748f20a?s=128

Uģis Ozols

March 26, 2013
Tweet

Transcript

  1. RUBY 2.0 ugisozols.com

  2. 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
  3. $  ruby  string_patch.rb      string_patch.rb:2:  warning:  Refinements  are  experimental,

       and  the  behavior  may  change  in  future  versions  of  Ruby! Refinments
  4. 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
  5. 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
  6. 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
  7. 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
  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  1.9",  {},  {:class  =>  "styled-­‐link"}) #  name  =  "Ruby  1.9" #  url_options  =  {} #  html_options  =  {:class=>"styled-­‐link"} Keyword Arguments
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. %i(foo  bar  baz)  #  =>  [:foo,  :bar,  :baz]   %I(foo

     b#{2+2}r  baz)  #  =>  [:foo,  :b4r,  :baz] %i and %I symbol literals
  15. #  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"
  16. 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
  17. 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
  18. 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
  19. ugisozols.com Thank you for listening!