Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

1 the ruby way

382 views

Published on

Een introductie tot Programmeren met Ruby

Published in: Technology, Education
  • Be the first to comment

  • Be the first to like this

1 the ruby way

  1. 1. Programmeren met Ruby The Ruby Way 1
  2. 2. Ruby installerenWindows: http://rubyinstaller.org/Linux en OSX: http://www.ruby-lang.org
  3. 3. Ruby scripts runnen
  4. 4. IRB - Interactive Ruby
  5. 5. .rb files> ruby mijn_script.rb
  6. 6. van PHP naar Ruby
  7. 7. van PHP naar Ruby (overeenkomsten)Geen variabelen declarerenEr zijn classes met public, protected en private toegangString interpolatie php: “$foo is een $bar” ruby: “#{foo} is een #{bar}”Er zijn Exceptionstrue en false hebben dezelfde behaviour als in php
  8. 8. van PHP naar Ruby (verschillen)Ruby kent strong typing: je moet to_s, to_i, etc ... gebruiken bijconversiesstrings, nummers, arrays, hashes zijn objecten abs(-1) wordt -1.absgebruik van () is optioneel bij functiesvariabelen zijn referentiesEr zijn geen abstracte ClassesHashes en Arrays zijn niet omwisselbaar met elkaarAlleen false en nil zijn false: 0, array(), “” zijn true
  9. 9. Duck Typing
  10. 10. Duck typing“Als een Object loopt als een eenden het geluid maakt van een eend,dan beschouwen we het als een eend.”
  11. 11. Duck typingdef append_song(result, song) unless result.kind_of?(String) fail TypeError.new("String expected") end unless song.kind_of?(Song) fail TypeError.new("Song expected") end result << song.title << " (" << song.artist << ")"endresult = ""append_song(result, song)
  12. 12. Duck typing def append_song(result, song)def append_song(result, song) result << song.title << " (" << song.artist << ")" unless result.kind_of?(String) end fail TypeError.new("String expected") end result = "" unless song.kind_of?(Song) append_song(result, song) fail TypeError.new("Song expected") end result << song.title << " (" << song.artist << ")"endresult = ""append_song(result, song)
  13. 13. Objecten
  14. 14. Objectenclass BookInStock def initialize(isbn, price) @isbn = isbn @price = Float(price) endendb1 = BookInStock.new("isbn1", 3)p b1=> #<BookInStock:0x0000010086aeb0 @isbn="isbn1", @price=3.0>b2 = BookInStock.new("isbn2", 3.14)p b2=> #<BookInStock:0x0000010086ad48 @isbn="isbn2", @price=3.14>b3 = BookInStock.new("isbn3", "5.67")p b3=> #<BookInStock:0x0000010086ac58 @isbn="isbn3", @price=5.67>
  15. 15. Objectenclass BookInStock def initialize(isbn, price) @isbn = isbn @price = Float(price) endendb1 = BookInStock.new("isbn1", 3)puts b1=> #<BookInStock:0x0000010086aeb0>b2 = BookInStock.new("isbn2", 3.14)puts b2=> #<BookInStock:0x0000010086ad48>b3 = BookInStock.new("isbn3", "5.67")puts b3=> #<BookInStock:0x0000010086ac58>
  16. 16. Objectenclass BookInStock def initialize(isbn, price) @isbn = isbn @price = Float(price) end def to_s "ISBN: #{@isbn}, price: #{@price}" endendb1 = BookInStock.new("isbn1", 3)puts b1=> ISBN: isbn1, price: 3.0b2 = BookInStock.new("isbn2", 3.14)puts b2=> ISBN: isbn2, price: 3.14b3 = BookInStock.new("isbn3", "5.67")puts b3=> ISBN: isbn3, price: 5.67
  17. 17. Objectenclass BookInStock def initialize(isbn, price) @isbn = isbn @price = Float(price) instance variabelen end def to_s "ISBN: #{@isbn}, price: #{@price}" endendb1 = BookInStock.new("isbn1", 3)puts b1=> ISBN: isbn1, price: 3.0b2 = BookInStock.new("isbn2", 3.14)puts b2=> ISBN: isbn2, price: 3.14b3 = BookInStock.new("isbn3", "5.67")puts b3=> ISBN: isbn3, price: 5.67
  18. 18. Instance variabelen
  19. 19. Instance variabeleninstance variabelen zijn privateAlleen het object zelf kan ze manipuleren
  20. 20. Attributen
  21. 21. AttributenGetters
  22. 22. Attributen Gettersclass BookInStock def initialize(isbn, price) @isbn = isbn @price = Float(price) end def isbn @isbn end def price @price end # ..end
  23. 23. Attributen Getters Settersclass BookInStock def initialize(isbn, price) @isbn = isbn @price = Float(price) end def isbn @isbn end def price @price end # ..end
  24. 24. Attributen Getters Settersclass BookInStock class BookInStock def initialize(isbn, price) def initialize(isbn, price) @isbn = isbn @isbn = isbn @price = Float(price) @price = Float(price) end end def isbn def price=(new_price) @isbn @price = new_price end end def price @price # .. end end # ..end
  25. 25. The Ruby Way class BookInStock attr_reader :isbn attr_accessor :price def initialize(isbn, price) @isbn = isbn @price = Float(price) end # ... end
  26. 26. The Ruby Way class BookInStock attr_reader :isbn attr_accessor :price def initialize(isbn, price) @isbn = isbn @price = Float(price) end # ... end book = BookInStock.new("isbn1", 33.80) puts "ISBN = #{book.isbn}" => ISBN = isbn1
  27. 27. The Ruby Way class BookInStock attr_reader :isbn attr_accessor :price def initialize(isbn, price) @isbn = isbn @price = Float(price) end # ... end book = BookInStock.new("isbn1", 33.80) puts "ISBN = #{book.isbn}" => ISBN = isbn1 puts "Price = #{book.price}" => Price = 33.8
  28. 28. The Ruby Way class BookInStock attr_reader :isbn attr_accessor :price def initialize(isbn, price) @isbn = isbn @price = Float(price) end # ... end book = BookInStock.new("isbn1", 33.80) puts "ISBN = #{book.isbn}" => ISBN = isbn1 puts "Price = #{book.price}" => Price = 33.8 book.price = book.price * 0.75 puts "New price = #{book.price}" => New price = 25.349999999999998
  29. 29. Arrays & Hashes
  30. 30. ArraysEen collectie van objecten, geïndexeerd door een positieve integer
  31. 31. ArraysEen collectie van objecten, geïndexeerd door een positieve integer a = [ 3.14159, "pie", 99 ] b = Array.new a.class b.class => Array => Array a.length b.length => 3 => 0 a[0] b[0] = "second" => 3.14159 b[1] = "array" a[1] b => "pie" => ["second", "array"] a[2] => 99 a[3] => nil
  32. 32. Arrays Stacks FIFOstack = [] queue = []stack.push "red" queue.push "red"stack.push "green" queue.push "green"stack.push "blue"p stack puts queue.shift=> ["red", "green", "blue"] => red puts queue.shiftputs stack.pop => green=> blueputs stack.pop=> greenputs stack.pop=> redp stack=> []
  33. 33. HashesEen collectie van objecten, dat geïndexeerd kan worden door elk objecttype
  34. 34. HashesEen collectie van objecten, dat geïndexeerd kan worden door elk objecttype h = { dog => canine, cat => feline, donkey => asinine }
  35. 35. HashesEen collectie van objecten, dat geïndexeerd kan worden door elk objecttype h = { dog => canine, cat => feline, donkey => asinine } h = { :dog => canine, :cat => feline, :donkey => asinine }
  36. 36. HashesEen collectie van objecten, dat geïndexeerd kan worden door elk objecttype h = { dog => canine, cat => feline, donkey => asinine } h = { :dog => canine, :cat => feline, :donkey => asinine }
  37. 37. SymbolenUnieke constanten zonder waardenEerste karakter “:” gevolgd door een naamVoornamelijk gebruikt als keys voor Hash{:name => “Ruby”} of {name: “Ruby”}
  38. 38. Blocks en Iterators
  39. 39. Blocks en Iteratorstop_five = {“de” => 1, “kat” => 1, “zat” => 1, “op” => 1, “de” => 1, “mat” => 1}
  40. 40. Blocks en Iteratorstop_five = {“de” => 1, “kat” => 1, “zat” => 1, “op” => 1, “de” => 1, “mat” => 1}for i in 0...5 word = top_five[i][0] count = top_five[i][1] puts "#{word}: #{count}"end
  41. 41. Blocks en Iteratorstop_five = {“de” => 1, “kat” => 1, “zat” => 1, “op” => 1, “de” => 1, “mat” => 1}for i in 0...5 word = top_five[i][0] count = top_five[i][1] puts "#{word}: #{count}"endtop_five.each do |word, count| puts "#{word}: #{count}"end
  42. 42. Blocks en Iteratorstop_five = {“de” => 1, “kat” => 1, “zat” => 1, “op” => 1, “de” => 1, “mat” => 1}for i in 0...5 word = top_five[i][0] count = top_five[i][1] puts "#{word}: #{count}"endtop_five.each do |word, count| puts "#{word}: #{count}" Blockend
  43. 43. Blocks en Iteratorstop_five = {“de” => 1, “kat” => 1, “zat” => 1, “op” => 1, “de” => 1, “mat” => 1}for i in 0...5 word = top_five[i][0] count = top_five[i][1] puts "#{word}: #{count}"endtop_five.each do |word, count| Iterator puts "#{word}: #{count}" Blockend
  44. 44. BlocksEen stuk code tussen {} of do end keywordsKan parameters meekrijgen tussen | param1 |Parameters zijn altijd gescoped binnen hetblockVariabelen zijn gescoped binnen een block,behalve als ze buiten het block gedefinieerdstaan
  45. 45. Blockssum = 0[1, 2, 3, 4].each do |value| square = value * value sum += squareendputs sum=> 30
  46. 46. Blockssum = 0 square = Shape.new(sides: 4)[1, 2, 3, 4].each do |value| # square = value * value # .. een heleboel code sum += square #end sum = 0puts sum [1, 2, 3, 4].each do |value|=> 30 square = value * value sum += square end puts sum square.draw # BOOM!
  47. 47. Blockssum = 0 square = Shape.new(sides: 4)[1, 2, 3, 4].each do |value| # square = value * value # .. een heleboel code sum += square #end sum = 0puts sum [1, 2, 3, 4].each do |value; square|=> 30 square = value * value sum += square end puts sum square.draw
  48. 48. Inheritance, Modules & Mixins
  49. 49. Inheritanceclass Parentendclass Child < Parentendputs "The superclass of Child is #{Child.superclass}"=> “The superclass of Child is Parent”puts "The superclass of Parent is #{Parent.superclass}"=> “The superclass of Parent is Object”puts "The superclass of Object is #{Object.superclass}"=> “The superclass of Object is BasicObject”puts "The superclass of BasicObject is #{BasicObject.superclass.inspect}"=> “The superclass of BasicObject is nil”
  50. 50. ModulesGroep van methods, classes en constantenEigen namespaceKunnen gebruikt worden voor Mixins
  51. 51. Modulesmodule Trig PI = 3.141592654 def Trig.sin(x) puts x endendmodule Moral VERY_BAD = 0 BAD = 1 def Moral.sin(badness) puts badness endend
  52. 52. Modulesmodule Trig PI = 3.141592654 def Trig.sin(x) puts x endendmodule Moral VERY_BAD = 0 BAD = 1 def Moral.sin(badness) puts badness endendy = Trig.sin(Trig::PI/4)wrongdoing = Moral.sin(Moral::VERY_BAD)=> 0.7853981635=> 0
  53. 53. Modulesmodule Trig PI = 3.141592654 def Trig.sin(x) puts x end Module methodsendmodule Moral VERY_BAD = 0 BAD = 1 def Moral.sin(badness) puts badness endendy = Trig.sin(Trig::PI/4)wrongdoing = Moral.sin(Moral::VERY_BAD)=> 0.7853981635=> 0
  54. 54. Instance methods?
  55. 55. Instance methods? module Debug def who_am_i? "#{self.class.name} (id: #{self.object_id}): #{self.name}" end end
  56. 56. Instance methods? module Debug def who_am_i? "#{self.class.name} (id: #{self.object_id}): #{self.name}" end endFOUT: Een module is geen Class
  57. 57. Wat heb je er dan aan?
  58. 58. Mixinsmodule Debug def who_am_i? "#{self.class.name} (id: #{self.object_id}): #{self.name}" endend
  59. 59. Mixinsmodule Debug def who_am_i? "#{self.class.name} (id: #{self.object_id}): #{self.name}" endend class Phonograph class EightTrack include Debug include Debug attr_reader :name attr_reader :name def initialize(name) def initialize(name) @name = name @name = name end end # ... # ... end end
  60. 60. Mixinsmodule Debug def who_am_i? "#{self.class.name} (id: #{self.object_id}): #{self.name}" endend class Phonograph class EightTrack include Debug include Debug attr_reader :name attr_reader :name def initialize(name) def initialize(name) @name = name @name = name end end # ... # ... end end
  61. 61. Mixinsmodule Debug def who_am_i? "#{self.class.name} (id: #{self.object_id}): #{self.name}" endend class Phonograph class EightTrack include Debug include Debug attr_reader :name attr_reader :name def initialize(name) def initialize(name) @name = name @name = name end end # ... # ... end end ph = Phonograph.new("West End Blues") et = EightTrack.new("Surrealistic Pillow") ph.who_am_i? et.who_am_i?
  62. 62. Mixinsmodule Debug def who_am_i? "#{self.class.name} (id: #{self.object_id}): #{self.name}" endend class Phonograph class EightTrack include Debug include Debug attr_reader :name attr_reader :name def initialize(name) def initialize(name) @name = name @name = name end end # ... # ... end end ph = Phonograph.new("West End Blues") et = EightTrack.new("Surrealistic Pillow") ph.who_am_i? # => "Phonograph (id: 2151894340): West End Blues" et.who_am_i? # => "EightTrack (id: 2151894300): Surrealistic Pillow"
  63. 63. Includeinclude is alleen een referentie naar demoduleAls de module in een ander bestand staatdan is require nodig om de modulebeschikbaar te makenLET OP: Als een method wijzigt in de moduledan wijzigt deze voor alle classes die demodule includen
  64. 64. Methods & Arguments
  65. 65. MethodsWorden definieerd met defBeginnen met een kleine letter of eenunderscore (_)Kunnen eindigen met een letter of cijferKunnen eindigen met een ? (boolean)Kunnen eindigen met een = (setters)Kunnen eindigen met een ! (bang methods)
  66. 66. Argumentsdef my_new_method(arg1, arg2, arg3) # ...end
  67. 67. Argumentsdef my_new_method(arg1, arg2, arg3) # ...enddef my_other_new_method # ...end
  68. 68. Argumentsdef my_new_method(arg1, arg2, arg3) # ...enddef my_other_new_method # ...enddef cool_dude(arg1="Miles", arg2="Coltrane", arg3="Roach") "#{arg1}, #{arg2}, #{arg3}."end
  69. 69. Argumentsdef my_new_method(arg1, arg2, arg3) # ...enddef my_other_new_method # ...enddef cool_dude(arg1="Miles", arg2="Coltrane", arg3="Roach") "#{arg1}, #{arg2}, #{arg3}."enddef varargs(arg1, *rest) "arg1=#{arg1}. rest=#{rest.inspect}"end
  70. 70. Expressions
  71. 71. ExpresionsAlles dat redelijkerwijs een waarde kanterug geven doet dat ookBijna alles is een expression
  72. 72. Expresions[ 3, 1, 7, 0 ].sort.reverse # => [7, 3, 1, 0]
  73. 73. Expresions[ 3, 1, 7, 0 ].sort.reverse # => [7, 3, 1, 0]song_type = if song.mp3_type == MP3::Jazz if song.written < Date.new(1935, 1, 1) Song::TradJazz else Song::Jazz end else Song::Other endrating = case votes_cast when 0...10 then Rating::SkipThisOne when 10...50 then Rating::CouldDoBetter else Rating::Rave end
  74. 74. Vergelijken van objecten== Test dezelfde waarde.=== Vergelijk of een element binnen een bepaald berijk valt. (1..10) === 5<=> Algemene vergelijkingsoperator. Geeft -1 bij kleiner dan, 0 bij gelijk, of +1 bij groter dan<,<=,>=,> Vergelijking voor kleiner dan, kleiner en gelijk, groter dan, groter en gelijk.=~ Reguliere expressie vergelijkingeql? True als de elementen dezelfde waarde en type hebben 1.eql?(1.0) is false.equal? True als de elementen dezelfde objectID hebben
  75. 75. Conditioneel uitvoerennil && 99 # => nilfalse && 99 # => false"cat" && 99 # => 99
  76. 76. Conditioneel uitvoerennil && 99 # => nilfalse && 99 # => false"cat" && 99 # => 99nil || 99 # => 99false || 99 # => 99"cat" || 99 # => "cat"
  77. 77. Conditioneel uitvoerennil && 99 # => nil var ||= "default value"false && 99 # => false"cat" && 99 # => 99nil || 99 # => 99false || 99 # => 99"cat" || 99 # => "cat"
  78. 78. Conditioneel uitvoerennil && 99 # => nil var ||= "default value"false && 99 # => false"cat" && 99 # => 99nil || 99 # => 99 month, day, year = $1, $2, $3 if date =~ /(dd)-(dd)-(dd)/false || 99 # => 99 puts "a = #{a}" if DEBUG"cat" || 99 # => "cat" print total unless total.zero?
  79. 79. Conditioneel uitvoerennil && 99 # => nil var ||= "default value"false && 99 # => false"cat" && 99 # => 99nil || 99 # => 99 month, day, year = $1, $2, $3 if date =~ /(dd)-(dd)-(dd)/false || 99 # => 99 puts "a = #{a}" if $DEBUG"cat" || 99 # => "cat" print total unless total.zero? cost = duration > 180 ? 0.35 : 0.25
  80. 80. Terug naar loops
  81. 81. Loops?while line = gets # ...end
  82. 82. Loops? until play_list.duration > 60while line = gets play_list.add(song_list.pop) # ... endend
  83. 83. Iterators3.times do print "Ho! "end=> Ho! Ho! Ho!
  84. 84. Iterators3.times do print "Ho! "end=> Ho! Ho! Ho!0.step(12, 3) {|x| print x, " " }=> 0 3 6 9 12
  85. 85. Iterators3.times do print "Ho! "end=> Ho! Ho! Ho!0.step(12, 3) {|x| print x, " " }=> 0 3 6 9 12File.open("ordinal").grep(/d$/) do |line| puts lineend
  86. 86. Iterators3.times do 0.upto(9) do |x| print "Ho! " print x, " "end end=> Ho! Ho! Ho! => 0 1 2 3 4 5 6 7 8 90.step(12, 3) {|x| print x, " " }=> 0 3 6 9 12File.open("ordinal").grep(/d$/) do |line| puts lineend
  87. 87. Iterators3.times do 0.upto(9) do |x| print "Ho! " print x, " "end end=> Ho! Ho! Ho! => 0 1 2 3 4 5 6 7 8 90.step(12, 3) {|x| print x, " " } [ 1, 1, 2, 3, 5 ].each {|val| print val, " " }=> 0 3 6 9 12 => 1 1 2 3 5File.open("ordinal").grep(/d$/) do |line| puts lineend
  88. 88. Iterators3.times do 0.upto(9) do |x| print "Ho! " print x, " "end end=> Ho! Ho! Ho! => 0 1 2 3 4 5 6 7 8 90.step(12, 3) {|x| print x, " " } [ 1, 1, 2, 3, 5 ].each {|val| print val, " " }=> 0 3 6 9 12 => 1 1 2 3 5File.open("ordinal").grep(/d$/) do |line| playlist.each do |song| puts line song.playend end
  89. 89. Exceptions
  90. 90. Exceptionsrequire open-uripage = "podcasts"file_name = "#{page}.html"web_page = open("http:/ /pragprog.com/#{page}")output = File.open(file_name, "w")while line = web_page.gets output.puts lineendoutput.close
  91. 91. Exceptionsrequire open-uripage = "podcasts"file_name = "#{page}.html"web_page = open("http:/ /pragprog.com/#{page}")output = File.open(file_name, "w")begin while line = web_page.gets output.puts line end output.closerescue Exception STDERR.puts "Failed to download #{page}: #{$!}" output.close File.delete(file_name) raiseend
  92. 92. En nu?
  93. 93. En nu?http://tryruby.org/levels/1/challenges/0
  94. 94. OpdrachtenVerhaalgeneratorCrazy 8-Ball SpelSteen, papier, schaarBlackjack SpelBoter, Kaas en Eieren Spel

×