Slide 1

Slide 1 text

Ruby Tips & Quirks #2 Michał Łomnicki http://mlomnicki.com

Slide 2

Slide 2 text

Local variables puts local_variables.inspect y = 4 puts local_variables.inspect

Slide 3

Slide 3 text

Local variables puts local_variables.inspect # => ["y"] y = 4 puts local_variables.inspect # => ["y"]

Slide 4

Slide 4 text

Local variables Ruby 1.8 puts local_variables.inspect # => ["y"] y = 4 puts local_variables.inspect # => ["y"]

Slide 5

Slide 5 text

Local variables Ruby 1.9 puts local_variables.inspect # => [:y] y = 4 puts local_variables.inspect # => [:y]

Slide 6

Slide 6 text

String vs Symbol class String unless instance_methods.include?("camelize") def camelize gsub(/\/(.?)/) { "::#{$1.upcase}" } .gsub(/(?:^|_)(.)/) { $1.upcase } end end end

Slide 7

Slide 7 text

String vs Symbol class String unless instance_methods.any? { |m| m.to_s == "camelize" def camelize gsub(/\/(.?)/) { "::#{$1.upcase}" } .gsub(/(?:^|_)(.)/) { $1.upcase } end end end

Slide 8

Slide 8 text

String vs Symbol class String unless instance_methods.method_defined?(:camelize) def camelize gsub(/\/(.?)/) { "::#{$1.upcase}" } .gsub(/(?:^|_)(.)/) { $1.upcase } end end end

Slide 9

Slide 9 text

module functions module Security def generate_password ('a'..'z').sample(8) end end class User include Security end User.new.generate_password

Slide 10

Slide 10 text

module functions module Security def generate_password ('a'..'z').sample(8) end end

Slide 11

Slide 11 text

module functions module Security extend self def generate_password ('a'..'z').sample(8) end end

Slide 12

Slide 12 text

module functions module Security extend self def generate_password ('a'..'z').sample(8) end end Security.generate_password

Slide 13

Slide 13 text

module functions module Security module_function def generate_password ('a'..'z').sample(8) end end Security.generate_password

Slide 14

Slide 14 text

respond_to?(:super) module Sanitizer def save puts "sanitized" super end end module Persistance def save puts "saved" super end end class User include Persistance include Sanitizer end

Slide 15

Slide 15 text

respond_to?(:super) module Sanitizer def save puts "sanitized" super end end module Persistance def save puts "saved" super end end class User include Persistance include Sanitizer end

Slide 16

Slide 16 text

respond_to?(:super) > User.new.save => sanitized => saved => save: super: no superclass method save (NoMeth

Slide 17

Slide 17 text

respond_to?(:super) module Sanitizer def save puts "sanitized" super if respond_to?(:super) end end module Persistance def save puts "saved" super if respond_to?(:super) end end class User include Persistance include Sanitizer end

Slide 18

Slide 18 text

respond_to?(:super) module Sanitizer def save puts "sanitized" super if respond_to?(:super) end end module Persistance def save puts "saved" super if respond_to?(:super) end end class User include Persistance include Sanitizer end

Slide 19

Slide 19 text

respond_to?(:super) > User.new.save => sanitized

Slide 20

Slide 20 text

respond_to?(:super) module Sanitizer def save puts "sanitized" super if defined?(super) end end module Persistance def save puts "saved" super if defined?(super) end end class User include Persistance include Sanitizer end

Slide 21

Slide 21 text

respond_to?(:super) > User.new.save => sanitized => saved

Slide 22

Slide 22 text

Class.include module Sanitizer def save puts "sanitized" super if defined(super) end end module Persistance def save puts "saved" super if defined(super) end end class User include Persistance include Sanitizer end

Slide 23

Slide 23 text

Class.include module Sanitizer def save puts "sanitized" super if defined(super) end end module Persistance def save puts "saved" super if defined(super) end end class User include Persistance, Sanitizer end

Slide 24

Slide 24 text

Class.include > User.new.save => saved => sanitized

Slide 25

Slide 25 text

Class.include class User include Persistance, Sanitizer end

Slide 26

Slide 26 text

Class.include class User include Sanitizer, Persistance end

Slide 27

Slide 27 text

Class.include > User.new.save => sanitized => saved

Slide 28

Slide 28 text

Block comments =begin Objects don't specify their attributes directly, but rather infer them from the table definition with which they're linked. Adding, removing, and changing attributes and their type is done directly in the database. =end

Slide 29

Slide 29 text

Ruby1.9 - each_with_object > (1..5).inject({}) do |i, hsh| hsh[i] = i*2 hsh end => {1=>2, 2=>4, 3=>6, 4=>8, 5=>10} VS > (1..5).each_with_object({}) do |i, hsh| hsh[i] = i*2 end => {1=>2, 2=>4, 3=>6, 4=>8, 5=>10}

Slide 30

Slide 30 text

Ruby1.9 - public_send class User protected def destroy puts "destroyed" end end User.new.public_send(:destroy) NoMethodError: protected method destroy called

Slide 31

Slide 31 text

Ruby1.9 - ObjectSpace.count_objects ObjectSpace.count_objects { :TOTAL=>76928, :FREE=>549, :T_OBJECT=>1363, :T_CLASS=>1008, :T_MODULE=>38, :T_FLOAT=>7, :T_STRING=>50339, :T_REGEXP=>234, :T_ARRAY=>7259, :T_HASH=>558, :T_FILE=>16, :T_DATA=>1695, }

Slide 32

Slide 32 text

Ruby1.9 define_finalizer str = "ruby1.9" ObjectSpace.define_finalizer(str) do |object_id| puts "string was destroyed id: #{object_id}" end str = nil GC.start => string was destroyed id: -607935038

Slide 33

Slide 33 text

Ruby1.9 call proc prc = proc { puts "proc called" } 1) prc.call(1) # 1.8 2) prc[2] # 1.8 3) prc.(3) # new 4) prc.===(4) # new

Slide 34

Slide 34 text

Ruby1.9 call proc sleep_time = proc do |time| case time.hour when 0..6 then true else false end end case Time.now when sleep_time puts "go to bed. now!" else puts "work harder" end

Slide 35

Slide 35 text

Ruby1.9 call proc sleep_time = proc do |time| case time.hour when 0..6 then true else false end end case Time.now when sleep_time puts "go to bed. now!" else puts "work harder" end sleep_time.===(Time.now)

Slide 36

Slide 36 text

Questions?