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

85 lines
1.9 KiB
Markdown
Raw Normal View History

2017-02-26 13:28:18 +01:00
+++
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](http://techspry.com/ruby_and_rails/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:
```ruby
a = lambda { puts "hello" }
b = -> { puts "hello" }
```
##### Blocks als argumenten doorgeven
Wordt slechts één aanvaard, `Proc`s 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?](http://awaxman11.github.io/blog/2013/08/05/what-is-the-difference-between-a-block/)):
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 :exclamation:
```ruby
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](http://www.railstips.org/blog/archives/2009/05/11/class-and-instance-methods-in-ruby/). Er zijn verschillende manieren om een class method te maken in ruby:
```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).