Ruby 2.0

508 views

Published on

Short presentation about Ruby 2.0 which I gave at a local Ruby meetup group.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
508
On SlideShare
0
From Embeds
0
Number of Embeds
22
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Ruby 2.0

  1. 1. RUBY 2.0 ugisozols.com
  2. 2. Refinmentsmodule  StringPatch    refine  String  do        def  is_number?            !!match(/^d+$/)        end    endend  "1".is_number?  #  =>  undefined  method  `is_number?  ...  using  StringPatch  "1".is_number?  #  =>  true"a".is_number?  #  =>  false
  3. 3. Refinments$  ruby  string_patch.rb      string_patch.rb:2:  warning:  Refinements  are  experimental,    and  the  behavior  may  change  in  future  versions  of  Ruby!
  4. 4. Module#prependmodule  A    def  foo;  puts  "A";  endend  class  B    include  A      def  foo;  puts  "B";  endend  klass  =  B.newklass.foo      #  =>  "B"B.ancestors  #  =>  [B,  A,  Object,  Kernel,  BasicObject]
  5. 5. Module#prependmodule  A    def  foo;  puts  "A";  endend  class  B    prepend  A  #  <-­‐  prepend  instead  of  include      def  foo;  puts  "B";  endend  klass  =  B.newklass.foo      #  =>  "A"B.ancestors  #  =>  [A,  B,  Object,  Kernel,  BasicObject]
  6. 6. Module#prependrequire  "active_support/core_ext/module/aliasing"  class  A    def  foo;  puts  "foo";  endend  class  A    def  foo_with_bar        foo_without_bar        puts  "bar"    end      alias_method_chain  :foo,  :barend  A.new.foo      #  =>  "foo  bar"A.ancestors  #  =>  [A,  Object,  Kernel,  BasicObject]
  7. 7. Module#prependclass  A    def  foo;  puts  "foo";  endend  module  Extension    def  foo        super        puts  "bar"    endend  class  A    prepend  Extensionend  A.new.foo      #  =>  "foo  bar"A.ancestors  #  =>  [Extension,  A,  Object,  Kernel,  BasicObject]
  8. 8. Keyword Argumentsdef  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"}
  9. 9. Keyword Argumentsdef  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"}
  10. 10. Keyword Argumentsdef  temperature(celsius,  fahrenheit:  to_fahrenheit(celsius))    puts  "#{celsius}°C"    puts  "#{fahrenheit}°F"end  def  to_fahrenheit(celsius)    celsius  *  9  /  5  +  32end  temperature(36)#  36°C#  96°F
  11. 11. Enumerable#lazywords  =  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. 12. Enumerable#lazywords  =  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. 13. Enumerable#lazyrequire  "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. 14. %i and %I symbol literals%i(foo  bar  baz)  #  =>  [:foo,  :bar,  :baz]  %I(foo  b#{2+2}r  baz)  #  =>  [:foo,  :b4r,  :baz]
  15. 15. Default source encoding is UTF-8#  Ruby  1.9#  encoding:  utf-­‐8#  without  ^  next  line  will  throw  "invalid  multibyte  char  (US-­‐ASCII)"name  =  "Uģis  Ozols"#  Ruby  2.0name  =  "Uģis  Ozols"
  16. 16. #to_hRuby  =  Struct.new(:version)ruby  =  Ruby.new("2.0")  ruby.to_h  #  =>  {  :version  =>  "2.0"  }def  config(options)    if  options.respond_to?(:to_h)        #  consume  hash    else        raise  TypeErorr,  "Cant  convert  #{options.inspect}  into  Hash"    endend
  17. 17. #respond_to? returnsfalse for protected methods class  A    protected      def  foo        "A"    end end   klass  =  A.new klass.respond_to?(:foo)  #=>  false klass.respond_to?(:foo,  true)  #=>  true
  18. 18. #require optimizationsRails  4.0.0.beta1  application  rails  g  scaffold  user  name  time  rake  test Ruby  1.9.3-­‐p392~  12  seconds  time  rake  test Ruby  2.0.0-­‐p0~  5  seconds
  19. 19. Thank you for listening! ugisozols.com

×