RUBY SEEN BY A C#
DEVELOPER
Emanuele DelBono - @emadb
I AM
I am a software
engineer and web
architect in
CodicePlastico. I write
web apps in C#,
javascript e ruby.
IT ISN’T A RUBY TUTORIAL
!

It’s a bunch of stuff that made me say
WOW!
C# (2002)
!

• Compiled, strongly typed
• OOP (multiparadigm)
• Delegate/lambda/enumerators
• ECMA standard
• Mono on Linux and MacOS
• “A better java”
RUBY (1995)
• Dynamic
• Open Source
• Interpreted
• Multi inheritance through Mixin
• Fully OOP
HELLO WORLD
using System;!


public class Program

{!
public void Main()

{!
Console.WriteLine("Hello World");

}!
}!
HELLO WORLD

p 'hello world'
RAILS
class Employee < ActiveRecord::Base!
belongs_to :company!
attr_accessible :name, :surname, :role!
has_many :activities!
before_save :update_role!
scope :managers, -> { where(role: 'manager') }!
!
def update_role!
# ...!
end!
def foo!
# ...!
end !
end
ALL CODE IS EXECUTED
class MyClass < (rand < 0.5 ? Array : Hash)!
end!
WOW!
REAL OOP
class is an instance of class
class Cat
end
cat = Cat.new
puts cat
#<Cat:0x007fa2bc13d5d8>
puts cat.class
Cat
puts cat.class.class
Class
puts cat.class.class.class
!

Class
Klazz = Class.new

=> Klazz
puts Klazz

=> Klazz
puts Klazz.class
Class
k = Klazz.new
=> #<Klazz:0x007f8fc121ab58>
Foo = Class.new do
def bar
"I'm bar...an instance method of foo"
end
end
!

a = Foo.new
p a.bar
=> "hello"
WOW!
SINGLETON METHODS

We can add methods to a single instance
class Cat
def meow; ’meow’; end
end
cat = Cat.new
new_cat = Cat.new
def cat.argh
'argh'
end
p cat.meow
=> "meow"
p cat.argh
=> "argh"
p new_cat.argh
NoMethodError: undefined method `argh' for
#<Cat:0x007fda63085878>
?

EIGENCLASS
THE OBJECT MODEL
• Every object, classes included, has its
own “real class,” be it a regular class
or an eigenclass
• The superclass of the eigenclass is the
object class
• The superclass of the eigenclass of a
class is the eigenclass of the class’s
superclass
THE OBJECT MODEL
class C; end
class D < C; end
obj = D.new

#Object

C

#C

D
obj

Object

#D

#obj

Metaprogramming Ruby - Pag. 125
WOW!
monkey patching
“a way to extend or modify the runtime
code of dynamic languages [...] without
altering the original source code.”
class String
def foo
to_s + ' fooed'
end
end
s = "hello"
puts s.foo
=> "hello fooed"
REMOVE METHODS
class String
remove_method :to_s
end
WOW!
duck typing
When I see a bird that walks like a duck
and swims like a duck and quacks like a
duck, I call that bird a duck
http://en.wikipedia.org/wiki/Duck_typing
class Type1
def foo; "I'm type1"; end
end
!

class Type2
def foo; "I'm type2"; end
end
def get_class
rand < 0.5 ? Type1 : Type2
end
!t

= get_class.new
p t.foo
=> "I'm type2" #or I'm type1
METHOD INTERCEPTION

Using alias and monkey patching we can
run through the execution
class
def
p
end
end
cat =

Cat
meow
"meow"

Cat.new

Cat.class_eval do
alias :meow_new :meow
def meow
p "i'm about to meow"
meow_new
p "did you hear me?"
end
end
=> "i'm about to meow"
=> "meow"
cat.meow
=> "did you hear me?"
METAPROGRAMMING
Metaprogramming is the writing of
computer programs that write or
manipulate other programs (or
themselves) as their data […]

http://en.wikipedia.org/wiki/Metaprogramming
METHOD MISSING
class Cat
def method_missing(method, *args)
#do something without failing
end
end
class Settings
def initialize(options)
options.each do |key, value|
self.instance_variable_set "@#{key}", value
self.class.send :define_method, key,

proc{self.instance_variable_get("@#{key}")}
self.class.send :define_method, "#{key}=",

proc{|v| self.instance_variable_set("@#{key}", v)}
end
end
end
c = Settings.new YAML.load_file("config.yaml")
!

p c.title # => "metaprogramming ruby"
p c.author # => "Paolo Perrotta"
p c.pub_year # => "2010"
!

c.title = 'metaprogramming ruby 2.00’
p c.title # => "metaprogramming ruby 2.00”
HOOKS
Since all code is executed. You can
intercept some “facts” about it.
inherited, append_features, included,
extend_object, extended, initialize_copy,
const_missing
WOW!
BUT THERE’S MORE
> [1, 2, 3] * 3 == [1, 2, 3, 1, 2, 3, 1, 2, 3]
> 1_000_000
> a = a || []
> a = [1,2,3]; a[-1]
> [1,2,3].shuffle
> (0..9).each { ... }
> 3.times {...}
> def name=(value); ...
PHILOSOPHY
I hope to see Ruby help
every programmer in the
world to be productive, and
to enjoy programming, and
to be happy. That is the
primary purpose of Ruby
language.
Yukihiro
Matsumoto
o = Object.new!
o.methods.count
=> 54

• ActiveRecord::Base => 367
• String => 161
• Fixnum => 128
SAME METRICS?
DIFFERENT WORLD?
RUBY PRO
• Simplicity
• REPL (irb, rails c, heroku run console)
• No ceremony
• One file app
• Community and frameworks
• Expressiveness (DSL)
CONS
• Freedom bring responsibility
• Performance
• No tools for refactoring
• Tests are mandatory (mmh…)
DOES IT WORTH?
LINGUISTIC RELATIVITY
“The principle of linguistic relativity holds
that the structure of a language affects
the ways in which its respective speakers
conceptualize their world.”
Sapir–Whorf hypothesis

http://en.wikipedia.org/wiki/Linguistic_relativity
THE PRAGMATIC
PROGRAMMER
“Learn at least one new language every
year. Different languages solve the same
problems in different ways. By learning
several different approaches, you can
help broaden your thinking and avoid
getting stuck in a rut.”
The Pragmatic Programmer
MORE LANGUAGES 

==

BETTER PROGRAMMER
Ruby seen by a C# developer

Ruby seen by a C# developer

  • 1.
    RUBY SEEN BYA C# DEVELOPER Emanuele DelBono - @emadb
  • 9.
    I AM I ama software engineer and web architect in CodicePlastico. I write web apps in C#, javascript e ruby.
  • 10.
    IT ISN’T ARUBY TUTORIAL ! It’s a bunch of stuff that made me say WOW!
  • 11.
    C# (2002) ! • Compiled,strongly typed • OOP (multiparadigm) • Delegate/lambda/enumerators • ECMA standard • Mono on Linux and MacOS • “A better java”
  • 12.
    RUBY (1995) • Dynamic •Open Source • Interpreted • Multi inheritance through Mixin • Fully OOP
  • 13.
    HELLO WORLD using System;! 
 publicclass Program
 {! public void Main()
 {! Console.WriteLine("Hello World");
 }! }!
  • 14.
  • 16.
    RAILS class Employee <ActiveRecord::Base! belongs_to :company! attr_accessible :name, :surname, :role! has_many :activities! before_save :update_role! scope :managers, -> { where(role: 'manager') }! ! def update_role! # ...! end! def foo! # ...! end ! end
  • 17.
    ALL CODE ISEXECUTED class MyClass < (rand < 0.5 ? Array : Hash)! end!
  • 18.
  • 19.
    REAL OOP class isan instance of class
  • 20.
    class Cat end cat =Cat.new puts cat #<Cat:0x007fa2bc13d5d8> puts cat.class Cat puts cat.class.class Class puts cat.class.class.class ! Class
  • 21.
    Klazz = Class.new
 =>Klazz puts Klazz
 => Klazz puts Klazz.class Class k = Klazz.new => #<Klazz:0x007f8fc121ab58>
  • 22.
    Foo = Class.newdo def bar "I'm bar...an instance method of foo" end end ! a = Foo.new p a.bar => "hello"
  • 23.
  • 24.
    SINGLETON METHODS We canadd methods to a single instance
  • 25.
    class Cat def meow;’meow’; end end cat = Cat.new new_cat = Cat.new def cat.argh 'argh' end p cat.meow => "meow" p cat.argh => "argh" p new_cat.argh NoMethodError: undefined method `argh' for #<Cat:0x007fda63085878>
  • 26.
  • 27.
    THE OBJECT MODEL •Every object, classes included, has its own “real class,” be it a regular class or an eigenclass • The superclass of the eigenclass is the object class • The superclass of the eigenclass of a class is the eigenclass of the class’s superclass
  • 28.
    THE OBJECT MODEL classC; end class D < C; end obj = D.new #Object C #C D obj Object #D #obj Metaprogramming Ruby - Pag. 125
  • 29.
  • 30.
    monkey patching “a wayto extend or modify the runtime code of dynamic languages [...] without altering the original source code.”
  • 31.
    class String def foo to_s+ ' fooed' end end s = "hello" puts s.foo => "hello fooed"
  • 32.
  • 33.
  • 34.
    duck typing When Isee a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck http://en.wikipedia.org/wiki/Duck_typing
  • 35.
    class Type1 def foo;"I'm type1"; end end ! class Type2 def foo; "I'm type2"; end end def get_class rand < 0.5 ? Type1 : Type2 end !t = get_class.new p t.foo => "I'm type2" #or I'm type1
  • 36.
    METHOD INTERCEPTION Using aliasand monkey patching we can run through the execution
  • 37.
    class def p end end cat = Cat meow "meow" Cat.new Cat.class_eval do alias:meow_new :meow def meow p "i'm about to meow" meow_new p "did you hear me?" end end => "i'm about to meow" => "meow" cat.meow => "did you hear me?"
  • 38.
    METAPROGRAMMING Metaprogramming is thewriting of computer programs that write or manipulate other programs (or themselves) as their data […] http://en.wikipedia.org/wiki/Metaprogramming
  • 39.
    METHOD MISSING class Cat defmethod_missing(method, *args) #do something without failing end end
  • 40.
    class Settings def initialize(options) options.eachdo |key, value| self.instance_variable_set "@#{key}", value self.class.send :define_method, key,
 proc{self.instance_variable_get("@#{key}")} self.class.send :define_method, "#{key}=",
 proc{|v| self.instance_variable_set("@#{key}", v)} end end end c = Settings.new YAML.load_file("config.yaml") ! p c.title # => "metaprogramming ruby" p c.author # => "Paolo Perrotta" p c.pub_year # => "2010" ! c.title = 'metaprogramming ruby 2.00’ p c.title # => "metaprogramming ruby 2.00”
  • 41.
    HOOKS Since all codeis executed. You can intercept some “facts” about it. inherited, append_features, included, extend_object, extended, initialize_copy, const_missing
  • 42.
  • 43.
    BUT THERE’S MORE >[1, 2, 3] * 3 == [1, 2, 3, 1, 2, 3, 1, 2, 3] > 1_000_000 > a = a || [] > a = [1,2,3]; a[-1] > [1,2,3].shuffle > (0..9).each { ... } > 3.times {...} > def name=(value); ...
  • 44.
    PHILOSOPHY I hope tosee Ruby help every programmer in the world to be productive, and to enjoy programming, and to be happy. That is the primary purpose of Ruby language. Yukihiro Matsumoto
  • 45.
    o = Object.new! o.methods.count =>54 • ActiveRecord::Base => 367 • String => 161 • Fixnum => 128
  • 46.
  • 47.
    RUBY PRO • Simplicity •REPL (irb, rails c, heroku run console) • No ceremony • One file app • Community and frameworks • Expressiveness (DSL)
  • 48.
    CONS • Freedom bringresponsibility • Performance • No tools for refactoring • Tests are mandatory (mmh…)
  • 49.
  • 50.
    LINGUISTIC RELATIVITY “The principleof linguistic relativity holds that the structure of a language affects the ways in which its respective speakers conceptualize their world.” Sapir–Whorf hypothesis
 http://en.wikipedia.org/wiki/Linguistic_relativity
  • 51.
    THE PRAGMATIC PROGRAMMER “Learn atleast one new language every year. Different languages solve the same problems in different ways. By learning several different approaches, you can help broaden your thinking and avoid getting stuck in a rut.” The Pragmatic Programmer
  • 52.