brainbaking/content/wiki/code/ruby/classes.md

1.9 KiB

+++ title = "classes" draft = false tags = [ "code", "ruby", "classes" ] date = "2014-03-11" +++

Ruby Classes

Closures and lambda's

Weer 4 verschillende mogelijkheden in Ruby, zie Proc and Lambda in Ruby

Native "blocks" aanmaken

Is niet mogelijk. a = { puts "hello" } geeft een Syntax error; dit moet effectief met Proc.new gebeuren.

Lambdas aanmaken

Kan ook weer op twee manieren:

a = lambda { puts "hello" }
b = -> { puts "hello" }
Blocks als argumenten doorgeven

Wordt slechts één aanvaard, Procs zijn objecten en kan dus op eender welke manier. Een block is eerder deel van de taal als syntax. (zoals bij do)

Een lambda is een Proc

Met twee grote verschillen (zie What is the difference between a block, a proc and a lambda in ruby?):

  1. een lambda controleert argumenten, een Proc kan het niet schelen.
  2. een return statement in een lambda stopt slechts de closure. In een Proc stopt het de hele enclosing method
def proc_test
  proc = Proc.new { return }
  proc.call
  puts "Hello world"
end

proc_test                 # calling proc_test prints nothing

Class methods

Zie Class and instance methods in Ruby. Er zijn verschillende manieren om een class method te maken in ruby:

# Way 1
class Foo
  def self.bar
    puts 'class method'
  end
end

Foo.bar # "class method"

# Way 2
class Foo
  class << self
    def bar
      puts 'class method'
    end
  end
end

Foo.bar # "class method"

# Way 3
class Foo; end
def Foo.bar
  puts 'class method'
end

Foo.bar # "class method"

Instance methods worden met def name gedefiniëerd, zoals men intuïtief zou aannemen (wow).