Tabela de Conteúdos
:: Topo :: doCoding :: Linguagens de Programação :: Ruby :: FORPC101 ::
Week-06
Aprendizagem
- O método load() inclui o source file de cada vez que é executado.
- O método require(), mais comum, apenas inclui o source file da primeira vez que é executado.
- As classes não são fechadas, são abertas, pelo que podem ser estendidas com novos métodos.
- Uma classe apenas pode herdar (descender) de uma e de uma só outra classe. Não é possível ter classes com herança múltipla.
- O método super():
- sem argumentos evoca o método da classe base com o mesmo nome do método da classe derivada que evoca super, passando-lhe os mesmos argumentos passados ao método overrided.
- sem argumentos e evocado como super() em vez só de super evoca o método da classe base mas sem lhe passar os argumentos.
- com argumentos evoca o método da classe base apenas com esses argumentos, explicitamente.
- Uma classe derivada (sub-classe) pode fazer o override a métodos da classe base (super-classe).
- Uma classe pode redefinir um método, mas apenas a última definição prevalece. Isto evita que seja possível fazer overloading a métodos.
Exercícios
Exercício 1
exercise-01.rb
=begin Write a class UnpredictableString which is a sub-class of String. This sub-class should have a method called scramble() and which works on any string as follows: >ruby unpredictablestring.rb daano.r n sdt a htIsw taikmgy r >Exit code: 0 # the original string was: "It was a dark and stormy night." =end class UnpredictableString < String def scramble self.split('').sort_by { rand }.join end end unpredictable_string = UnpredictableString.new('It was a dark and stormy night.') puts unpredictable_string.scramble
Exercício 2
exercise-02.rb
=begin This exercise thanks to Kathy Sierra. Once upon a time in a software shop, two programmers were given the same spec and told to "build it". The Really Annoying Project Manager forced the two coders to compete, by promising that whoever delivers first gets one of those cool Aeron chairs all the Silicon Valley guys have. The spec: There will be shapes on a GUI, a square, a circle and a traingle. When the user clicks on a shape, the shape will rotate clockwise 360 degrees (ie. all the way around) and play an AIF sound file specific to that particular shape. Go for it guys and show me your code. =end class Shape @aif_sound_file_name def initialize(file_name) @aif_sound_file_name = file_name end def rotate_clockwise(angle = 360) puts self.class.to_s + ' rotation of ' + angle.to_s + 'º clockwise.' end def play_sound puts 'Playing AIF SoundFile: ' + @aif_sound_file_name end def click_event rotate_clockwise(360) play_sound end end class Circle < Shape def initialize super('circle.aif') end def rotate_clockwise(angle = 360) puts self.class.to_s + ' rotation of ' + angle.to_s + 'º clockwise.' end end class Triangle < Shape def initialize super('triangle.aif') end def rotate_clockwise(angle = 360) puts self.class.to_s + ' rotation of ' + angle.to_s + 'º clockwise.' end end class Square < Shape def initialize super('square.aif') end def rotate_clockwise(angle = 360) puts self.class.to_s + ' rotation of ' + angle.to_s + 'º clockwise.' end end shape = Shape.new('shape.aif') shape.click_event circle = Circle.new circle.click_event triangle = Triangle.new triangle.click_event square = Square.new square.click_event
Questionário
Referências
Considerações
Pontos Altos
Esta secção regista o que considero serem os pontos altos da linguagem Ruby quando comparada com outras linguagens que conheço.
- É realmente uma linguagem object-oriented, de raíz.
Pontos Baixos
Esta secção regista o que considero serem os pontos baixos da linguagem Ruby quando comparada com outras linguagens que conheço.
- Será que a impossibilidade de poder realizar method overloading é um problema? Em principio não. Pela minha experiência os construtores de uma classe normalmente partilham código, que por (mau) hábito é “clonado” entre cada um. Visto o Ruby permitir a passagem de um número variável de argumentos parece-me, à primeira vista, que a solução Ruby é mais prática e concisa.