Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Ruby Tricks 2
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Michał Łomnicki
November 21, 2012
Technology
3
73
Ruby Tricks 2
Michał Łomnicki
November 21, 2012
Tweet
Share
More Decks by Michał Łomnicki
See All by Michał Łomnicki
DDD, Rails and persistence
mlomnicki
1
280
Forget Ruby. Forget CoffeeScript. Do SOA
mlomnicki
1
130
Having fun with legacy apps
mlomnicki
1
67
CAP Theorem
mlomnicki
2
130
[PL] Transakcje w bazach danych
mlomnicki
1
270
SchemaPlus
mlomnicki
1
45
Other Decks in Technology
See All in Technology
情シスのための生成AI実践ガイド2026 / Generative AI Practical Guide for Business Technology 2026
glidenote
0
230
AIエージェント時代に備える AWS Organizations とアカウント設計
kossykinto
3
920
クラウド × シリコンの Mashup - AWS チップ開発で広がる AI 基盤の選択肢
htokoyo
2
250
20260311 ビジネスSWG活動報告(デジタルアイデンティティ人材育成推進WG Ph2 活動報告会)
oidfj
0
300
Everything Claude Code を眺める
oikon48
0
830
JAWS DAYS 2026 ExaWizards_20260307
exawizards
0
420
SRE NEXT 2026 CfP レビュアーが語る聞きたくなるプロポーザルとは?
yutakawasaki0911
1
290
マルチアカウント環境でSecurity Hubの運用!導入の苦労とポイント / JAWS DAYS 2026
genda
0
620
Dr. Werner Vogelsの14年のキーノートから紐解くエンジニアリング組織への処方箋@JAWS DAYS 2026
p0n
1
130
わたしがセキュアにAWSを使えるわけないじゃん、ムリムリ!(※ムリじゃなかった!?)
cmusudakeisuke
1
710
Claude Code のコード品質がばらつくので AI に品質保証させる仕組みを作った話 / A story about building a mechanism to have AI ensure quality, because the code quality from Claude Code was inconsistent
nrslib
13
7.6k
Oracle Cloud Infrastructure IaaS 新機能アップデート 2025/12 - 2026/2
oracle4engineer
PRO
0
120
Featured
See All Featured
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
150
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
130
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
640
Optimizing for Happiness
mojombo
378
71k
GitHub's CSS Performance
jonrohan
1032
470k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.9k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.5k
Mind Mapping
helmedeiros
PRO
1
120
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
170
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
0
180
The Cost Of JavaScript in 2023
addyosmani
55
9.8k
Transcript
Ruby Tips & Quirks #2 Michał Łomnicki http://mlomnicki.com
Local variables puts local_variables.inspect y = 4 puts local_variables.inspect
Local variables puts local_variables.inspect # => ["y"] y = 4
puts local_variables.inspect # => ["y"]
Local variables Ruby 1.8 puts local_variables.inspect # => ["y"] y
= 4 puts local_variables.inspect # => ["y"]
Local variables Ruby 1.9 puts local_variables.inspect # => [:y] y
= 4 puts local_variables.inspect # => [:y]
String vs Symbol class String unless instance_methods.include?("camelize") def camelize gsub(/\/(.?)/)
{ "::#{$1.upcase}" } .gsub(/(?:^|_)(.)/) { $1.upcase } end end end
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
String vs Symbol class String unless instance_methods.method_defined?(:camelize) def camelize gsub(/\/(.?)/)
{ "::#{$1.upcase}" } .gsub(/(?:^|_)(.)/) { $1.upcase } end end end
module functions module Security def generate_password ('a'..'z').sample(8) end end class
User include Security end User.new.generate_password
module functions module Security def generate_password ('a'..'z').sample(8) end end
module functions module Security extend self def generate_password ('a'..'z').sample(8) end
end
module functions module Security extend self def generate_password ('a'..'z').sample(8) end
end Security.generate_password
module functions module Security module_function def generate_password ('a'..'z').sample(8) end end
Security.generate_password
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
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
respond_to?(:super) > User.new.save => sanitized => saved => save: super:
no superclass method save (NoMeth
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
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
respond_to?(:super) > User.new.save => sanitized
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
respond_to?(:super) > User.new.save => sanitized => saved
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
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
Class.include > User.new.save => saved => sanitized
Class.include class User include Persistance, Sanitizer end
Class.include class User include Sanitizer, Persistance end
Class.include > User.new.save => sanitized => saved
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
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}
Ruby1.9 - public_send class User protected def destroy puts "destroyed"
end end User.new.public_send(:destroy) NoMethodError: protected method destroy called
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, }
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
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
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
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)
Questions?