7. Interpretacja czy kompilacja?
>ruby my_program.rb >javac MyProgram.java
>java MyProgram
Kod ładowany w trakcie wykonania
Dostęp do kodu działającego programu
Kod źródłowy zawsze dostępny
Niższa wydajność
Białystok, JTeam, 2010-04-15
8. Dynamiczne, silne typowanie
1. def len(list)
Wartości mają typ, zmienne nie 2. x = 0
3. list.each do |element|
Mniejsza złożoność języka 4.
5.
x += 1
end
6. x
Brak deklaracji typów 7. end
Brak rzutowań
Większa elastyczność public static int len(List list)
{
Błędy w czasie wykonania int x = 0;
Iterator listIterator =
list.iterator();
while(listIterator.hasNext()){
x += 1;
}
return x;
}
Białystok, JTeam, 2010-04-15
9. Zwięzła składnia Ruby
Pusty program
Java
Class Test {
public static void main(String[] args){}
}
Ruby
Białystok, JTeam, 2010-04-15
10. Zwięzła składnia Ruby
Accessors (pl?) Class Circle {
private Coordinate center, float radius;
Java public void setCenter(Coordinate center){
this.center = center;
}
public Coordinate getCenter(){
return center;
}
public void setRadius(float radius){
this.radius = radius;
}
public Coordinate getRadius(){
return radius;
}
}
class Circle
attr_accessor :center, :radius
Ruby end
Białystok, JTeam, 2010-04-15
13. Klasy wbudowane...
…można rozszerzać
Jak zniszczyć wszechświat?
Białystok, JTeam, 2010-04-15
14. Klasy wbudowane...
…można rozszerzać
Jak zniszczyć wszechświat?
class Fixnum
def +(i)
self - i
end
end
>3 + 1
=> 2
Białystok, JTeam, 2010-04-15
18. Bloki
>find_integer(["a",1, 4, 2,"9","c"]) {|e| e.odd?}
=> 1
1. def find_integer(array)
2. for element in array
3. if element.is_a?(Integer) && yield element
4. return element
5. end
6. end
7. end
Białystok, JTeam, 2010-04-15
19. Metaprogramowanie
Wykonanie kodu
>eval("puts 'Hi JTeam'")
=> Hi JTeam
Rozszerzanie klas
1. speaker = Class.new
2. speaker.class_eval do
3. def hello_jteam
4. puts "Hello JTeam!"
5. end
6. end
7. wojtek = speaker.new
8. wojtek.hello_jteam
9. => "Hello JTeam!"
Białystok, JTeam, 2010-04-15
20. Metaprogramowanie
Dodawanie metod
1. people = ["michal", "wojtek"]
2. speaker = Class.new
3. speaker.class_eval do
4. people.each do |person|
5. define_method("hello_#{person}") {
6. puts "Hello #{person}"
7. }
8. end
9. end
10. hubert = speaker.new
11. hubert.methods - Object.methods
12. => ["hello_michal", "hello_wojtek"]
13. hubert.hello_michal
14. => "Hello michal"
Białystok, JTeam, 2010-04-15
21. Podsumowanie
Ruby jest elegancki
Pozwala wiele wyrazić
Jest elastyczny
Łatwo rozszerzyć wszystko
Zwięzły
Białystok, JTeam, 2010-04-15
22. Podsumowanie
Ruby jest elegancki
Pozwala wiele wyrazić
Jest elastyczny
Łatwo rozszerzyć wszystko
Zwięzły
A co z Javą?
Białystok, JTeam, 2010-04-15