9
MTAT.03.295 Agile Software Development in the Cloud Lecture 3: More on Ruby Luciano García-Bañuelos University of Tartu

MTAT.03 - ut · MTAT.03.295 Agile Software Development in the Cloud Lecture 3: More on Ruby Luciano García-Bañuelos University of Tartu

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: MTAT.03 - ut · MTAT.03.295 Agile Software Development in the Cloud Lecture 3: More on Ruby Luciano García-Bañuelos University of Tartu

MTAT.03.295

Agile Software Development in the Cloud

Lecture 3: More on Ruby Luciano García-Bañuelos University of Tartu

Page 2: MTAT.03 - ut · MTAT.03.295 Agile Software Development in the Cloud Lecture 3: More on Ruby Luciano García-Bañuelos University of Tartu

Blocks

RUBY                              LUCIANO  GARCÍA-­‐BAÑUELOS  

class Array ! def iterate! ! self.each_with_index do |n, i| ! self[i] = yield(n) ! end! end!end!!array = [1, 2, 3, 4] !!array.iterate! do |n| ! n ** 2 !end!!puts array.inspect!

Page 3: MTAT.03 - ut · MTAT.03.295 Agile Software Development in the Cloud Lecture 3: More on Ruby Luciano García-Bañuelos University of Tartu

Blocks => Procs

RUBY                              LUCIANO  GARCÍA-­‐BAÑUELOS  

class Array ! def iterate!(&code) ! self.each_with_index do |n, i| ! self[i] = code.call(n) ! end! end!end!!array = [1, 2, 3, 4] !!array.iterate! do |n| ! n ** 2 !end!!puts array.inspect!

Page 4: MTAT.03 - ut · MTAT.03.295 Agile Software Development in the Cloud Lecture 3: More on Ruby Luciano García-Bañuelos University of Tartu

Procs … can be reused!

RUBY                              LUCIANO  GARCÍA-­‐BAÑUELOS  

class Array ! def iterate!(code) ! self.each_with_index do |n, i| ! self[i] = code.call(n) ! end! end!end!!array_1 = [1, 2, 3, 4] !array_2 = [2, 3, 4, 5] !!square = Proc.new {|n| n ** 2} !!array_1.iterate!(square) !array_2.iterate!(square) !!puts array_1.inspect !puts array_2.inspect !

Page 5: MTAT.03 - ut · MTAT.03.295 Agile Software Development in the Cloud Lecture 3: More on Ruby Luciano García-Bañuelos University of Tartu

Lambdas

RUBY                              LUCIANO  GARCÍA-­‐BAÑUELOS  

class Array ! def iterate!(code) ! self.each_with_index do |n, i| ! self[i] = code.call(n) ! end! end!end!!array = [1, 2, 3, 4] !!array.iterate!( lambda { |n| n ** 2 })!!puts array.inspect!

Page 6: MTAT.03 - ut · MTAT.03.295 Agile Software Development in the Cloud Lecture 3: More on Ruby Luciano García-Bañuelos University of Tartu

Lambdas … strictly check number of parameters

RUBY                              LUCIANO  GARCÍA-­‐BAÑUELOS  

def args(code) ! one, two = 1, 2 ! code.call(one, two) !end!!args(Proc.new{|a, b, c| puts "Give me a #{a} and a #{b} and a #{c.class}"}) !!args(lambda{|a, b, c| puts "Give me a #{a} and a #{b} and a #{c.class}"})!

Page 7: MTAT.03 - ut · MTAT.03.295 Agile Software Development in the Cloud Lecture 3: More on Ruby Luciano García-Bañuelos University of Tartu

Lambdas … perform “diminutive returns”

RUBY                              LUCIANO  GARCÍA-­‐BAÑUELOS  

def proc_return! Proc.new { return "Proc.new"}.call ! return "proc_return method finished"!end!!def lambda_return! lambda { return "lambda" }.call ! return "lambda_return method finished"!end!!puts proc_return!puts lambda_return!

Page 8: MTAT.03 - ut · MTAT.03.295 Agile Software Development in the Cloud Lecture 3: More on Ruby Luciano García-Bañuelos University of Tartu

Classes and Mixins

RUBY                              LUCIANO  GARCÍA-­‐BAÑUELOS  

module Persistence ! def load sFileName! puts ”Reading ‘#{sFileName}’ contents into 'my_data'" ! end! def save sFileName! puts "Persisting '#{@my_data}' into '#{sFileName}'"! end! !end!!class MyClass! include Persistence ! attr :my_data! ! def data=(someData) ! @my_data = someData! end!end!!b = MyClass.new!b.data = "This_15_my_pwd"!b.save("passwords") !b.load("passwords") !

Page 9: MTAT.03 - ut · MTAT.03.295 Agile Software Development in the Cloud Lecture 3: More on Ruby Luciano García-Bañuelos University of Tartu

Finally … metaprogramming

RUBY                              LUCIANO  GARCÍA-­‐BAÑUELOS  

class Polyglot ! @@greetings = {estonian: "Tere hommikust", english: "Good morning"} !! def Polyglot.add_language(language, greeting) ! @@greetings[language] = greeting if language.is_a? Symbol ! end !! def method_missing(name) ! unless @@greetings[name].nil? ! puts @@greetings[name] ! else! super! end! end!end!!a = Polyglot.new!!a.estonian!a.english!