Skip to content

Instantly share code, notes, and snippets.

@benzimmer
Last active December 29, 2015 02:19
Show Gist options
  • Save benzimmer/7600048 to your computer and use it in GitHub Desktop.
Save benzimmer/7600048 to your computer and use it in GitHub Desktop.
Ruby beginners workshop

Infopark&Friends Ruby Beginners Workshop

$> irb

Alles ist ein Objekt

Um in Ruby Dinge zu tun versetzt man sich in die Lage eines Objektes. Um herauszufinden welches Objekt man gerade ist benutzt man self

self
=> main

Wenn man vorher nicht spezifiziert in welchem Objekt man sich befinden möchte ist man in main -> das default Objekt.

Mit Objekten reden

Ein Objekt kann mit einem anderen 'reden'. Dazu gibt es sogenannte Methoden. Man spricht davon das "ein Objekt die Methode eines anderen Objektes aufruft". Um das zu tun fügt man einen '.' an das Objekt an das man befragen möchte und schreibt die Methode dahinter.

2.even?
=> true

2 ist ein Objekt. even? ist die Methode.

1.next
=> 2

Methoden können aneinander angehangen werden:

1.next.next
=> 3

Die zweite Methode wird auf dem Rückgabewert (das Objekt 2) der ersten Methode aufgerufen.

Methoden nachschauen

1.methods.sort

Alphabetisch sortierte Liste der Methoden eines Integers.

Methoden mit Argumenten

Methoden können Argumente übergeben werden, die die Ausgabe beeinflussen.

['stein', 'schere', 'papier'].index('papier')
=> 2

'papier' ist das Argument für die Methode index. index gibt die Stelle aus an der sich das Argument in der Liste befindet. Man kann mehrere Argumente übergeben indem man sie mit einem Komma trennt:

2.between?(1, 3)
=> true

Methoden, die nur true oder false ausgeben (sogenannte Booleans), werden in Ruby mit ? abgeschlossen.

Spezielle Methoden

In der Liste der Methoden für Integer tauchen auch Symbole wie + und - auf.

4.+(2)
=> 6

Ist aufwändig zu tippen. Ruby versucht es dem Programmierer möglichst einfach zu machen Dinge zu erreichen. Daher kann eine Addition auch so geschrieben werden:

4 + 2
=> 6

Andere Spezial-Methoden

+ - * / = == != > < >= <= []

Strings

Ein Objekt das Text repräsentiert. Um einen String zu erstellen setzt man den zukünftigen Inhalt in Anführungszeichen.

"Infopark and Friends"
=> "Infopark and Friends"

Es gibt zwei Arten von Anführungszeichen in Ruby '' und "". Beide erstellen Strings, haben aber kleine Unterschiede. Mehr dazu später.

Auch Strings haben eine Reihe von Methoden.

"Infopark and Friends".length
=> 20

String interpolation

Ein essentielles Feature von Strings ist, dass man Platzhalter benutzen kann um dynamische Inhalte zu bekommen.

a = 1
b = 4
puts "Die Zahl #{a} ist kleiner als #{b}"
=> "Die Zahl 1 ist kleiner als 4"

Valider Ruby Code kann mit #{} in einem String 'untergebracht' werden und wird bei der Ausgabe des Strings ausgewertet. Dies funktioniert aber nur mit "". Der essentielle Unterschied zwischen single- und double-quotes ist das double-quotes sogenannte Escape-Sequenzen unterstützen (z.B. \n für 'new-line').

Suchen in Strings

"Infopark powers great websites".include?('power')
=> true

"Workshops are great for learning".start_with?('Work')
=> true

"But workshops should also be fun".end_with?('fun')
=> true

Manche Objekte haben ähnliche Methoden.

['stein', 'schere', 'papier'].index('papier')
=> 2

"Workshop".index('k')
=> 3

Veränderung von Strings

puts 'hier wird alles klein geschrieben'.upcase

HIER WIRD ALLES KLEIN GESCHRIEBEN => nil

'Hier wird SPASS gross geschrieben.'.downcase
=> "hier wird spass gross geschrieben."

"HIER geht's DRUNTER und DRÜBER".swapcase

Anwendungsfall unklar...

"Links wie Rechts".split(' ')
=> ["Links", "wie", "Rechts"]

"Links" + "Rechts"
=> "LinksRechts"

"Links"concat("Rechts")
=> "LinksRechts"

"Ruby und Ruby on Rails".sub('Ruby', 'Ich')
=> "Ich und Ruby on Rails"

"Ruby und Ruby on Rails".gsub('Ruby', 'Ich')
=> "Ich und Ich on Rails"

Logische Operatoren

1 == 2
=> false
2 == 2
=> true

2 >= 1 || 0 >= 1
=> true

2 >= 1 && 0 >= 1
=> false

! (2 == 2)
=> false

Kontrollstrukturen

if .. else

number = 1
if number > 0
  "#{number} is positive"
else
  "#{number} is negative"
end

number = 0
if number > 0
  "#{number} is positive"
elsif number == 0
  "#{number} is zero"
else
  "#{number} is negative"
end

puts "This is not displayed" unless number < 0

Schleifen

loop do
  puts "This will not stop until I press Ctrl-C"
end

5.times do
  puts "Drei ist keine gerade Zahl"
end

Arrays

Eine Liste von Objekten. Es gibt zwei Arten ein Array zu erzeugen:

[]
=> []

oder

Array.new
=> []

Beispiele

[1, 2, 3, 4]
[1, 'two', 3, 'four']

Daten aus einen Array abrufen

['stein', 'schere', 'papier'][0]
=> 'stein'

['stein', 'schere', 'papier'][-1]
=> 'papier'

Daten hinzufügen

['stein', 'schere', 'papier'] << 'echse'
=> ['stein', 'schere', 'papier', 'echse']

['stein', 'schere', 'papier'].push('echse')
=> ['stein', 'schere', 'papier', 'echse']

Daten in Arrays verändern

['stein', 'schere', 'papier'].map { |item| item.upcase }
=> ["STEIN", "SCHERE", "PAPIER"]

Verändert nicht das Original!

Filtern

['stein', 'schere', 'papier'].select { |item| item.start_with?('s') }
=> ["stein", "schere"]

Elemente löschen

['stein', 'schere', 'papier'].delete_if { |item| item.length < 6 }
=> ["schere", "papier"]

[1, 2, 3, 4, 5, 6, 7, 8].delete_if { |number| number.even? }
=> [1, 3, 5, 7]

Worte in Methodennamen werden durch _ getrennt.

For Schleifen

array = ['stein', 'schere', 'papier']
for item in array
  puts item
end

array = ['stein', 'schere', 'papier']
array.each do |item|
  puts item
end

Hashes

Schlüssel-Werte-Paare (key-value pairs). Können erzeugt werden durch

{}
=> {}

oder

Hash.new
=> {}

Beispiele

browser_versions = {
  chrome: 31,
  firefox: 25,
  internet_explorer: 10,
}

Werte abrufen

browser_versions[:chrome]
=> 31

Werte verändern

browser_versions[:internet_explorer] = 11
=> 11

browser_versions.each do |browser, version|
  puts "#{browser.capitalize}: #{version}"
end

Klassen

Jedes Objekt hat eine Klasse

puts 1.class
=> Fixnum

puts "".class
=> String

puts [].class
=> Array

Man kann ein Objekt nach seiner Klasse fragen

puts 1.is_a?(Integer)
=> true

puts 1.is_a?(String)
=> false

Klassen gruppieren Funktionalität. In der Ruby werden Klassen als eine Art Bauplan verwendet. Um den Bauplan zu verwenden wird dieser initialisiert:

Object.new
=> #<Object:0x007f81c385b820>

Diese Instanz kann dann benutzt werden um zB Berechnungen durch zu führen.

Es ist natürlich auch möglich eigene Klassen zu bauen. Sehen wir später.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment