Ruby Tutorial - Part 3

Ruby, Ruby on Rails, Sinatra, ...

Συντονιστές: WebDev Moderators, Super-Moderators, Ruby Moderators

Απάντηση
Άβαταρ μέλους
stewas
Script Master
Δημοσιεύσεις: 436
Εγγραφή: 25 Αύγ 2009 13:48
Τοποθεσία: Πάργα - Αθήνα και Ιωάννινα Πλέον
Επικοινωνία:

Ruby Tutorial - Part 3

Δημοσίευση από stewas » 07 Αύγ 2010 13:40

(Συνέχεια του προηγούμενου http://www.freestuff.gr/forums/viewtopic.php?t=51303 - Τρίτο και φαρμακερό ;) )

Είδαμε στο προηγούμενο ποστ πως φτιάχνουμε ένα αντικείμενο. Είδαμε επίσης πως το αντικείμενο αυτό φτιάχνεται από μία κλάση. Τώρα ας δούμε τι μεθόδους μας δίνει η Ruby για να χειριστούμε αυτή τη κλάση

Γράψτε : Greeter.instance_methods

Κώδικας: Επιλογή όλων

irb(main):039:0> Greeter.instance_methods
=> ["method", "send", "object_id", "singleton_methods",
    "__send__", "equal?", "taint", "frozen?",
    "instance_variable_get", "kind_of?", "to_a",
    "instance_eval", "type", "protected_methods", "extend",
    "eql?", "display", "instance_variable_set", "hash",
    "is_a?", "to_s", "class", "tainted?", "private_methods",
    "untaint", "say_hi", "id", "inspect", "==", "===",
    "clone", "public_methods", "respond_to?", "freeze",
    "say_bye", "__id__", "=~", "methods", "nil?", "dup",
    "instance_variables", "instance_of?"]
αρκετές είναι. Περιλαμβάνονται και πολλές default. Άμα θέλουμε να δούμε μόνο τις μεθόδους που γράψαμε εμείς για τη κλάση Greeter πρέπει να δώσουμε την παράμετρο false δηλ

Κώδικας: Επιλογή όλων

irb(main):040:0> Greeter.instance_methods(false)
=> ["say_bye", "say_hi"]
Ωραία. πριν φτιάξαμε ένα αντικείμενο με το όνομα g αν θυμάστε
ας το χειριστούμε λίγο και ας δούμε πως αυτό ανταποκρίνεται

Κώδικας: Επιλογή όλων

irb(main):041:0> g.respond_to?("name")
=> false
irb(main):042:0> g.respond_to?("say_hi")
=> true
irb(main):043:0> g.respond_to?("to_s")
=> true
τέλεια. στο προηγούμενο ποστ είδαμε ότι δεν μπορούμε να αλλάξουμε την μεταβλητή name. Αλλά οι κανόνες έχουν και τις εξαιρέσεις τους :)

Η Ruby μας δίνει την δυνατότητα να μπορούμε να επεξεργαστούμε μία υπάρχουσα κλάση. αυτό γίνεται ως εξής :

Κώδικας: Επιλογή όλων

irb(main):044:0> class Greeter
irb(main):045:1>   attr_accessor :name
irb(main):046:1> end
=> nil
ας δούμε τι κάναμε

Κώδικας: Επιλογή όλων

irb(main):047:0> g = Greeter.new("Andy")
=> #<Greeter&#58;0x3c9b0 @name="Andy">
irb&#40;main&#41;&#58;048&#58;0> g.respond_to?&#40;"name"&#41;
=> true
irb&#40;main&#41;&#58;049&#58;0> g.respond_to?&#40;"name="&#41;
=> true
irb&#40;main&#41;&#58;050&#58;0> g.say_hi
Hi Andy!
=> nil
irb&#40;main&#41;&#58;051&#58;0> g.name="Betty"
=> "Betty"
irb&#40;main&#41;&#58;052&#58;0> g
=> #<Greeter&#58;0x3c9b0 @name="Betty">
irb&#40;main&#41;&#58;053&#58;0> g.name
=> "Betty"
irb&#40;main&#41;&#58;054&#58;0> g.say_hi
Hi Betty!
=> nil
Μία χαρά. πλέον μπορούμε να αλλάξουμε την μεταβλητή name και αυτό το επιτύχαμε προσθέτοντας την εντολή attr_accessor η οποία μας δίνει 2 μεθόδους: 1) name από όπου μας δίνεται η τιμή της μεταβλητής name και 2) την name= από όπου μπορούμε να δώσουμε τιμή στην μεταβλητή name.

Ωραία πράγματα κάνει ως εδώ η Ruby δεν συμφωνείται? Αλλά αυτό το αντικείμενο που φτιάξαμε έχει τοπική ισχύ και εξυπηρετεί μόνο εμάς που "παίζουμε" στην κονσόλα Ruby. Εμείς όμως θέλουμε να εξυπηρετεί μία ευρεία κοινότητα ατόμων. Τι θα κάνουμε λοιπόν?
Πρέπει να φτιάξουμε ένα αρχείο καταρχάς και να βάλουμε μέσα τον κώδικά μας.

φτιάχνουμε λοιπόν ένα αρχείο (πχ με notepad) και γράφουμε μέσα αυτό

Κώδικας: Επιλογή όλων

#!/usr/bin/env ruby

class MegaGreeter
  attr_accessor &#58;names

  # Create the object
  def initialize&#40;names = "World"&#41;
    @names = names
  end

  # Say hi to everybody
  def say_hi
    if @names.nil?
      puts "..."
    elsif @names.respond_to?&#40;"each"&#41;

      # @names is a list of some kind, iterate!
      @names.each do |name|
        puts "Hello #&#123;name&#125;!"
      end
    else
      puts "Hello #&#123;@names&#125;!"
    end
  end

  # Say bye to everybody
  def say_bye
    if @names.nil?
      puts "..."
    elsif @names.respond_to?&#40;"join"&#41;
      # Join the list elements with commas
      puts "Goodbye #&#123;@names.join&#40;", "&#41;&#125;.  Come back soon!"
    else
      puts "Goodbye #&#123;@names&#125;.  Come back soon!"
    end
  end

end


if __FILE__ == $0
  mg = MegaGreeter.new
  mg.say_hi
  mg.say_bye

  # Change name to be "Zeke"
  mg.names = "Zeke"
  mg.say_hi
  mg.say_bye

  # Change the name to an array of names
  mg.names = &#91;"Albert", "Brenda", "Charles",
    "Dave", "Englebert"&#93;
  mg.say_hi
  mg.say_bye

  # Change to nil
  mg.names = nil
  mg.say_hi
  mg.say_bye
end
το σώζουμε ως "ri20min.rb" και το τρέχουμε ως "ruby ri20min.rb"
Αν τα κάνουμε όλα σωστά θα δούμε στην έξοδο κάτι σαν και αυτό

Κώδικας: Επιλογή όλων

Hello World!
Goodbye World.  Come back soon!
Hello Zeke!
Goodbye Zeke.  Come back soon!
Hello Albert!
Hello Brenda!
Hello Charles!
Hello Dave!
Hello Englebert!
Goodbye Albert, Brenda, Charles, Dave, Englebert.  Come
back soon!
...
...
ας εξηγήσουμε λίγο τα άγνωστα κομμάτια του κώδικα. Η πρώτη γραμμή ορίζει το κέλυφος από όπου θα τρέξει το πρόγραμμα (μόνο για Unix Συστήματα). Οι υπόλοιπες γραμμές κώδικα που ξεκινάνε από # είναι σχόλια και δεν εκτελούνται.

Κοιτάξτε λίγο την μέθοδο say_hi και παρατηρείστε ότι μέσα της κάνουμε έναν έλεγχο με το παγκοσμίως γνωστό if. Δηλ κοιτάμε αν η μεταβλητή name έχει την τιμή nil δηλ τίποτα τότε εκτυπώνει τις 3 τελείες αλλιώς σας αφήνω να το εξηγήσετε μόνοι σας (άμα δεν τα καταφέρετε πείτε μου να σας το εξηγήσω αν και το εξηγώ κάτα κάποιον τρόπο παρακάτω :) )

Εκτός τον έλεγχο if μπορούμε να χρησιμοποιήσουμε επαναληπτικές δόμες ( loops )
Υπάρχουν οι εξής

Κώδικας: Επιλογή όλων

@names.each do |name|
  puts "Hello #&#123;name&#125;!"
end
όπου είναι η λεγόμενη ΓΙΑ ΚΑΘΕ δομή που στην πραγματικότητα τελειώνει όταν τελειώσει μια λίστα που παίρνει ως παράμετρο ( εδώ παίρνει την λίστα με όνομα @names ).


Υπάρχει η

Κώδικας: Επιλογή όλων

for name in @names do
 puts name
end 
Και υπάρχουν και οι :

Κώδικας: Επιλογή όλων

10.times do
    puts "Hello World"
end

6.upto&#40;20&#41; do |number|
   p number
end 
(έχουν γίνει κάποιες διορθώσεις εδώ απο τον χρήστη Kainourios τον οποίο και ευχαριστώ θερμά)
Τις οποίες δεν εξηγώ γιατί κάποιος και ελάχιστα Αγγλικά να ξέρει καταλαβαίνει τι κάνουν (παρόλα αυτά ρωτάτε με δεν είναι ντροπή).

Αυτά είναι τα βασικά. Άμα ξέχασα κάτι θα το προσθέσω. Θα τελειώσω αυτή τη σειρά βοηθημάτων με μία φράση που την έχω πάντα στο μυαλό μου : Μπορεί άμα ρωτήσεις κάτι, έστω και απλό, να σε κάνει να φανείς χαζός τώρα αλλά άμα δεν ρωτήσεις θα μείνεις χαζός για πάντα. Ο νοών νοεί τω....

Με εκτίμηση και Σεβασμό
Βασίλης
Τελευταία επεξεργασία από το μέλος stewas την 08 Αύγ 2010 18:14, έχει επεξεργασθεί 1 φορά συνολικά.

Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

Ruby Tutorial - Part 3

Δημοσίευση από mrpc » 08 Αύγ 2010 16:09

Keep up the good work! Έγινε βοήθημα.

Άβαταρ μέλους
stewas
Script Master
Δημοσιεύσεις: 436
Εγγραφή: 25 Αύγ 2009 13:48
Τοποθεσία: Πάργα - Αθήνα και Ιωάννινα Πλέον
Επικοινωνία:

Ruby Tutorial - Part 3

Δημοσίευση από stewas » 08 Αύγ 2010 16:22

mrpc έγραψε:Keep up the good work! Έγινε βοήθημα.
thanks a lot :D . Και σύντομα ευελπιστώ να ανέβει σε συνεργασία με άλλο μέλος Ruby On Rails

Άβαταρ μέλους
Kainourios
Ruby Moderator
Δημοσιεύσεις: 504
Εγγραφή: 18 Μάιος 2005 16:20
Τοποθεσία: Κορυδαλλός
Επικοινωνία:

Ruby Tutorial - Part 3

Δημοσίευση από Kainourios » 08 Αύγ 2010 18:03

Μπράβο Βασίλη, μια μικρή μόνο διορθωσούλα, το for στη ruby δεν υπάρχει με αυτή τη μορφή, γίνεται π.χ.

Κώδικας: Επιλογή όλων

for name in @names do
 puts name
end
Παρόμοιο με το each, αν και το each χρησιμοποιείται πιο συχνά γενικότερα.


Υπάρχουν επίσης και άλλοι τρόποι επανάληψης όπως:

Κώδικας: Επιλογή όλων

10.times do
    puts "Hello World"
end

6.upto&#40;20&#41; do |number|
   p number
end

Θα ετοιμάσουμε ένα σε rails.

Άβαταρ μέλους
stewas
Script Master
Δημοσιεύσεις: 436
Εγγραφή: 25 Αύγ 2009 13:48
Τοποθεσία: Πάργα - Αθήνα και Ιωάννινα Πλέον
Επικοινωνία:

Ruby Tutorial - Part 3

Δημοσίευση από stewas » 08 Αύγ 2010 18:10

Kainourios έγραψε:Μπράβο Βασίλη, μια μικρή μόνο διορθωσούλα, το for στη ruby δεν υπάρχει με αυτή τη μορφή, γίνεται π.χ.

Κώδικας: Επιλογή όλων

for name in @names do
 puts name
end
Παρόμοιο με το each, αν και το each χρησιμοποιείται πιο συχνά γενικότερα.


Υπάρχουν επίσης και άλλοι τρόποι επανάληψης όπως:

Κώδικας: Επιλογή όλων

10.times do
    puts "Hello World"
end

6.upto&#40;20&#41; do |number|
   p number
end

Θα ετοιμάσουμε ένα σε rails.
ευχαριστω πολυ για την διορθωση @Kainourios το αλλάζω τώρα. ομως γιατί στο online tutorial το έχει έτσι? είναι λάθος η μήπως είναι πιο παλιά η έκδοση εκεί?

Άβαταρ μέλους
Kainourios
Ruby Moderator
Δημοσιεύσεις: 504
Εγγραφή: 18 Μάιος 2005 16:20
Τοποθεσία: Κορυδαλλός
Επικοινωνία:

Ruby Tutorial - Part 3

Δημοσίευση από Kainourios » 08 Αύγ 2010 18:22

Για δώσε link να το δω :).

Πάντως δεν παίζει ούτε σε έκδοση 1.8.7 ούτε σε 1.9.2 (το δοκίμασα γιατί μου έκανε εντύπωση μήπως το βάλανε στη νέα έκδοση) αλλά γενικότερα μπορείς να την φτιάξεις.

Στο βιβλίο The ruby programming language έχει παράδειγμα που την φτιάχνει αν θυμάμαι καλά.

Άβαταρ μέλους
stewas
Script Master
Δημοσιεύσεις: 436
Εγγραφή: 25 Αύγ 2009 13:48
Τοποθεσία: Πάργα - Αθήνα και Ιωάννινα Πλέον
Επικοινωνία:

Ruby Tutorial - Part 3

Δημοσίευση από stewas » 08 Αύγ 2010 18:26

http://www.ruby-lang.org/en/documentation/quickstart/4/

αλλά τωρα που το παρατηρω καλύτερα λεει ότι μου είπες και εσυ. απλα λεει οτι δουλεύει

Απάντηση

Επιστροφή στο “Ruby & frameworks”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες