ScotRuby - Dark side of ruby
-
Upload
gautam-rege -
Category
Software
-
view
692 -
download
0
description
Transcript of ScotRuby - Dark side of ruby
![Page 1: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/1.jpg)
The Dark Side of Ruby
@gautamrege!@joshsoftware
![Page 2: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/2.jpg)
What’s the talk about?• Ruby is AWESOME but …
• Nothing scary
• Weirdness and Gotcha’s
Ah-ha! Moments
really
![Page 3: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/3.jpg)
Slides are Tagged
BeginnerExpert
![Page 4: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/4.jpg)
(In)Famous Infinityhttp://www.flickr.com/photos/emdot/482622478/sizes/l/
![Page 5: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/5.jpg)
(In)Famous Infinity$ irb> 1/0
$ irb> 1.0/0
$ irb> Infinity
=> ZeroDivisionError: divided by 0
=> Infinity
=> NameError: uninitialized constant Infinity
![Page 6: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/6.jpg)
(In)Famous Infinity#if !defined(INFINITY) || !defined(NAN)!union bytesequence4_or_float {! unsigned char bytesequence[4];! float float_value;!};!#endif!!RUBY_EXTERN const union bytesequence4_or_float rb_infinity;
include/ruby/missing.h
![Page 7: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/7.jpg)
Base Jumping
http://www.flickr.com/photos/shahdi/8035647153/sizes/l/
![Page 8: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/8.jpg)
Base Conversions$ irb> 12345.to_s(8)
$ irb> 12345.to_s(36)
$ irb> 1234.to_s(64)
=> "30071" # => Octal
=> "9ix" # That is an actual number
=> ArgumentError: invalid radix 64
![Page 9: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/9.jpg)
![Page 10: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/10.jpg)
Splat ExpanderJob = Struct.new(:name, :occupation) tom = Job.new("Tom", "Developer") name, occupation = *tom
=> ["Tom", "Developer"] => name # "Tom" => occupation # "Developer"
![Page 11: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/11.jpg)
Splat ExpanderJob = Struct.new(:name, :occupation) tom = Job.new(occupation: "Developer", name: "Tom") name, occupation = *tom
=> name # {:occupation=>"Developer", :name=> "Tom"} => occupation # nil
![Page 12: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/12.jpg)
Hashes and Arraysa=[1,2,3,4,5,6]!h=Hash[*a]=> {1=>2, 3=>4, 5=>6}
[1,2,3] * 3!=> [1,2,3,1,2,3,1,2,3]
[1,2,3] * "%"!=> "1%2%3"
![Page 13: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/13.jpg)
blk.(1, 2, 3, 4, 5, 6)=> 5
syntax sugar for call blk[1,2,3,4,5,6]
Calling out to Stabbyblk = ->(f, *m, sl, l) do puts sl end
blk.call(1, 2, 3, 4, 5, 6) => 5
![Page 14: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/14.jpg)
Syntax
def foo(a: 1, b:, c: 2)
end
foo(a: 2) => ArgumentError: missing keyword: b
Mandatory keyword arguments
def foo(a: 1, b: 2)
endkeyword arguments
def foo(a=1, b=1,opts={})
end
![Page 15: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/15.jpg)
Case Complexity
![Page 16: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/16.jpg)
The Case Statementdef multiple_of(factor)! Proc.new {|p| p.modulo(factor).zero?}!end!!
number = 9!case number! when multiple_of(3)! puts "Multiple of 3"! when multiple_of(7)! puts "Multiple of 7"!end
![Page 17: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/17.jpg)
Behind every case is a ===number = 9!case number ! when multiple_of(3)
Proc.new {|p| p.modulo(3).zero?} === 9
Proc.new { |p| ! p.modulo(3).zero?!}.call(9)
Proc#=== is an alias to Proc#call.
![Page 18: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/18.jpg)
Override the === method to customise case
evaluation.
![Page 19: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/19.jpg)
==, ===, eql?, equal?
http://www.flickr.com/photos/gak/2418146934/sizes/o/
![Page 20: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/20.jpg)
==, ===, eql?, equal?
=> false # equality by value
=> false # gotcha?
irb> 1 == 1.0=> true # generic equalityirb> 1 === 1.0=> true # case equalityirb> 1.eql? 1.0
irb> 1.equal? 1.0=> false # object identityirb> 'a'.equal? 'a'
=> true # gotcha?irb> 1.equal? 1
![Page 21: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/21.jpg)
Object Ids & Fixnum
Fixnum * 2 + 1irb> 23 * 2 + 1 => 47 irb > 23.object_id => 47
irb> (2**62 - 1).class => Fixnum irb> (2**62).class => Bignum
![Page 22: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/22.jpg)
http://www.flickr.com/photos/miscdebris/6748016253/sizes/o/
![Page 23: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/23.jpg)
3 Pulls for the Jackpotjackpot = lambda { |x, y, z| (x == y) == (x == z) } # 3 pulls pull = jackpot.curry[rand(5)] 2.times { pull = pull.curry[rand(5)] } !
p pull ? "Jackpot" : "Sucker!"
![Page 24: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/24.jpg)
The curry recipe
• Return lambda till all parameters are passed.
• Evaluate the block if all parameters are passed.
pull = jackpot.curry[rand(5)] => #<Proc:0x007f9eec0990b0 (lambda)>
2.times { pull = pull.curry[rand(5)] } => true # or false
![Page 25: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/25.jpg)
So! So you think you can tell…
Heaven from HellProtected from Private- Pink Floyd
![Page 26: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/26.jpg)
Private methodsclass Soldier private def ryan puts "inside private ryan" end end class Movie < Soldier def name ryan end end
Private Methods are inherited!
![Page 27: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/27.jpg)
Private method!Instance method !
Defined the class Module
class Base! include Mongoid::Document!end
The elusive include
![Page 28: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/28.jpg)
Protected methods
• Work with objects not classes.
• Invoke a protected method on another object in the same lineage
What the …
![Page 29: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/29.jpg)
class Autobot def initialize(nick); @nick = nick; end !
protected attr_accessor :nick end !prime = Autobot.new("Optimus Prime") p prime.nick
protected method `nick' called for #<Autobot:0x007f92ba082330 @nick="Optimus Prime"> (NoMethodError)
![Page 30: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/30.jpg)
class Autobot def fights(target) p "I am #{self.nick}" p "Kicking #{target.nick}'s ass" end protected attr_accessor :nick end !optimus = Autobot.new("Optimus Prime") megatron = Autobot.new('Megatron') !optimus.fights megatron
"I am Optimus Prime" "Kicking Megatron's ass"
![Page 31: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/31.jpg)
Keywords in Ruby?
![Page 32: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/32.jpg)
Keywords - hmm…class Serious def true false end def false true end end die = Serious.new p "seriously!" if die.false
stack too deep?
![Page 33: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/33.jpg)
superlativeclass Search! def search! p "Default Search algorithm"! end!end!class KeywordSearch < Search ! def search(keyword:)! super! end!end!KeywordSearch.new.search(keyword: "Ruby")
`search`: wrong number of arguments (1 for 0)
![Page 34: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/34.jpg)
superlativeclass Search! def search! p "Default Search algorithm"! end!end!class KeywordSearch < Search ! def search(keyword:)! super()! end!end!KeywordSearch.new.search(keyword: "Ruby")
And we thought parenthesis for method invocation didn’t matter
![Page 35: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/35.jpg)
Module mixins are funnymodule Superman! def fly; p "Superman: It's a bird"; end!end!!module Batman! def fly; p "Batman: Fly? Me?"; end!end!!module Ironman! def fly; p "Iroman: That's flying!"; end!end
![Page 36: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/36.jpg)
Module mixins are funnyclass Tinyman! include Superman! include Batman! include Ironman!end!!Tinyman.new.fly
"Iroman: That's how you fly!"
![Page 37: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/37.jpg)
Module Inheritance?module Superman! def fly; p "Superman: It's a bird"; end!end!!module Batman! def fly; p "Batman: Fly? Me?"; end!end!!module Ironman! def fly; super; p "Iroman: That's flying!"; end!end
"Batman: Fly? Me?”!"Iroman: That's flying!"
![Page 38: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/38.jpg)
class Tinyman! include Superman! include Ironman! include Batman!end
Dynamic Inheritance!class Tinyman! include Superman! include Batman! include Ironman!end
![Page 39: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/39.jpg)
Cherry pick from Modules
module Megatron! def power! p "Megatron's super strength"! end!!
def evil! p 'Evil genius'! end!end
![Page 40: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/40.jpg)
class Hanuman! include Megatron!end
Hanuman.new.power!# => "Megatron's super strength"!Hanuman.new.evil !# => "Evil genius" # Oh no!
Cherry pick from Modules
![Page 41: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/41.jpg)
Cherry pick from Modulesclass Hanuman! def power! Megatron.instance_method(:power).! bind(self).call! end!end
Hanuman.new.power!# => "Megatron's super strength"!Hanuman.new.evil !# => undefined method `evil’...>
![Page 42: ScotRuby - Dark side of ruby](https://reader036.fdocuments.in/reader036/viewer/2022062312/554f4b6db4c905524c8b49a3/html5/thumbnails/42.jpg)
That’s all Folks!
@gautamrege @joshsoftware
since 2007