Ruby seen from a C# developer

Post on 17-May-2015

202 views 2 download

Tags:

description

At first glance, from a C# developer’s perspective, Ruby may seem a silly language with strange constructs and lousy syntax. But if you are able to get beyond this you will find a powerful and productive language to develop web applications and useful scripts. During the session we will take a look at Ruby from a C# perspective and analyse some of the “oddities” of this marvellous language!

Transcript of Ruby seen from a C# developer

RUBY SEEN BY A C# DEVELOPEREmanuele 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'

RAILSclass 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.class.class.class !Class

puts cat #<Cat:0x007fa2bc13d5d8>

puts cat.class Cat

puts cat.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

obj #obj

D

C

Object

#D

#C

#Object

Metaprogramming Ruby - Pag. 125

class C; end class D < C; end obj = D.new

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 Cat def meow p "meow" end end cat = 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

cat.meow

=> "i'm about to meow" => "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

class Cat def method_missing(method, *args) #do something without failing end end

METHOD MISSING

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 endc = 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); ...

PHILOSOPHYI 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