Ruby tricks2

723 views

Published on

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
723
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Ruby tricks2

  1. 1. Ruby Tips & Quirks #2 Michał Łomnicki http://mlomnicki.com
  2. 2. Local variablesputs local_variables.inspecty = 4puts local_variables.inspect
  3. 3. Local variablesputs local_variables.inspect # => ["y"]y = 4puts local_variables.inspect # => ["y"]
  4. 4. Local variables Ruby 1.8puts local_variables.inspect # => ["y"]y = 4puts local_variables.inspect # => ["y"]
  5. 5. Local variables Ruby 1.9puts local_variables.inspect # => [:y]y = 4puts local_variables.inspect # => [:y]
  6. 6. String vs Symbolclass String unless instance_methods.include?("camelize") def camelize gsub(//(.?)/) { "::#{$1.upcase}" } .gsub(/(?:^|_)(.)/) { $1.upcase } end endend
  7. 7. String vs Symbolclass String unless instance_methods.any? { |m| m.to_s == "camelize" def camelize gsub(//(.?)/) { "::#{$1.upcase}" } .gsub(/(?:^|_)(.)/) { $1.upcase } end endend
  8. 8. String vs Symbolclass String unless instance_methods.method_defined?(:camelize) def camelize gsub(//(.?)/) { "::#{$1.upcase}" } .gsub(/(?:^|_)(.)/) { $1.upcase } end endend
  9. 9. module functionsmodule Security def generate_password (a..z).sample(8) endendclass User include SecurityendUser.new.generate_password
  10. 10. module functionsmodule Security def generate_password (a..z).sample(8) endend
  11. 11. module functionsmodule Security extend self def generate_password (a..z).sample(8) endend
  12. 12. module functionsmodule Security extend self def generate_password (a..z).sample(8) endendSecurity.generate_password
  13. 13. module functionsmodule Security module_function def generate_password (a..z).sample(8) endendSecurity.generate_password
  14. 14. respond_to?(:super)module Sanitizer def save puts "sanitized" super endendmodule Persistance def save puts "saved" super endendclass User include Persistance include Sanitizerend
  15. 15. respond_to?(:super)module Sanitizer def save puts "sanitized" super endendmodule Persistance def save puts "saved" super endendclass User include Persistance include Sanitizerend
  16. 16. respond_to?(:super) > User.new.save=> sanitized=> saved=> save: super: no superclass method save (NoMeth
  17. 17. respond_to?(:super)module Sanitizer def save puts "sanitized" super if respond_to?(:super) endendmodule Persistance def save puts "saved" super if respond_to?(:super) endendclass User include Persistance include Sanitizerend
  18. 18. respond_to?(:super)module Sanitizer def save puts "sanitized" super if respond_to?(:super) endendmodule Persistance def save puts "saved" super if respond_to?(:super) endendclass User include Persistance include Sanitizerend
  19. 19. respond_to?(:super)> User.new.save=> sanitized
  20. 20. respond_to?(:super)module Sanitizer def save puts "sanitized" super if defined?(super) endendmodule Persistance def save puts "saved" super if defined?(super) endendclass User include Persistance include Sanitizerend
  21. 21. respond_to?(:super) > User.new.save=> sanitized=> saved
  22. 22. Class.includemodule Sanitizer def save puts "sanitized" super if defined(super) endendmodule Persistance def save puts "saved" super if defined(super) endendclass User include Persistance include Sanitizerend
  23. 23. Class.includemodule Sanitizer def save puts "sanitized" super if defined(super) endendmodule Persistance def save puts "saved" super if defined(super) endendclass User include Persistance, Sanitizerend
  24. 24. Class.include > User.new.save=> saved=> sanitized
  25. 25. Class.includeclass User include Persistance, Sanitizerend
  26. 26. Class.includeclass User include Sanitizer, Persistanceend
  27. 27. Class.include > User.new.save=> sanitized=> saved
  28. 28. Block comments=begin Objects dont specify their attributes directly, but rather infer them from the table definition with which theyre linked. Adding, removing, and changing attributes and their type is done directly in the database.=end
  29. 29. 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}
  30. 30. Ruby1.9 - public_sendclass User protected def destroy puts "destroyed" endendUser.new.public_send(:destroy)NoMethodError: protected method destroy called
  31. 31. Ruby1.9 - ObjectSpace.count_objectsObjectSpace.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,}
  32. 32. Ruby1.9 define_finalizerstr = "ruby1.9"ObjectSpace.define_finalizer(str) do |object_id| puts "string was destroyed id: #{object_id}"endstr = nilGC.start=> string was destroyed id: -607935038
  33. 33. Ruby1.9 call proc prc = proc { puts "proc called" }1) prc.call(1) # 1.82) prc[2] # 1.83) prc.(3) # new4) prc.===(4) # new
  34. 34. Ruby1.9 call procsleep_time = proc do |time| case time.hour when 0..6 then true else false endendcase Time.nowwhen sleep_time puts "go to bed. now!"else puts "work harder"end
  35. 35. Ruby1.9 call procsleep_time = proc do |time| case time.hour when 0..6 then true else false endendcase Time.nowwhen sleep_time puts "go to bed. now!"else puts "work harder"endsleep_time.===(Time.now)
  36. 36. Questions?

×