Μια ερώτηση για την Ruby

2 views
Skip to first unread message

louposk

unread,
Sep 6, 2009, 2:55:44 PM9/6/09
to Ruby Hellug
Καλησπέρα,
μπορείτε να μου εξηγήσετε τί σημαίνει ακριβώς και που χρησιμεύει το
attr_accessor, attr_reader και attr_writer στην Ruby??
Ευχαριστώ
Κωνσταντίνος

vaggelis typaldos

unread,
Sep 6, 2009, 3:37:37 PM9/6/09
to lou...@gmail.com, Ruby Hellug
Χρειάζονται για να μπορείς να έχεις δυνατότητα ανάγνωσης (read) και
εγγραφής (write) στις μεταβλητές του αντικειμένου

Ας υποθέσουμε ότι έχουμε μία κλάση Klass,

class Klass
def initialize
@a=1 ; @b=2
end
end


Αν φτιάξεις ένα αντικείμενο
k=Klass.new
δεν μπορείς να διαβάσεις τις τιμές των μεταβλητών (instance variables
@a,@b), αλλά και ούτε να τις αλλάξεις.
Για να γίνει αυτό θα πρέπει να δηλωθούν μέσα στην κλάση μία μέθοδος
ανάγνωσης (getter) και εγγραφής (setter) για κάθε μεταβλητή.

class Klass
def initialize
@a=1 ; @b=2
end

def a #getter
return @a
end

def a=(x) #setter
@a=x
end
end

Τώρα ,
k=Klass.new;
print k.a #=> 1
k.a=3
print k.a #=>3

Επειδή είναι πολύ συχνό φαινόμενο, για να μην φτιάχνουμε κάθε φορά
αυτές τις 2 μεθόδους υπάρχουν τα shortcuts:

attr_reader :a # ορίζει μόνο τη μέθοδο getter : def a; a; end
attr_writer :a # ορίζει μόνο τη μέθοδο setter: def a=(x); @a=x; end
attr_accessor :a # και τις δύο παραπάνω

Για παράδειγμα για τη μεταβλητή @b

class Klass
attr_writer :b

def initialize
@a, @b = 1, 2
end
end

k=Klass.new
k.b=3 #=> θα αλλάξει τη μεταβλητή @b σε 3, αλλά
print k.b #=> θα δώσει λάθος γιατί έχω δηλώσει μόνο το attr_writer

Konstantinos Pachnis

unread,
Sep 6, 2009, 3:50:41 PM9/6/09
to Ruby Hellug
Είναι shortcuts για accessor methods. Για παράδειγμα πες ότι έχει μια class Person και θες να μπορέσεις να πάρεις το όνομα και το επίθετο ενός ατόμου.

class Person
  attr_reader :fname, :lname
  def initialize(fname, lname)
    @fname = fname
    @lname = lname
  end
end

pr = Person.new("John", "Papas")
p pr.fname
p pr.lname

Το attr_reader στην συγκεκριμένη περίπτωση δημιουργεί συντομεύσεις για τις δύο παρακάτω μεθόδους
  
def fname
    @fname
  end
  
  def lname
    @lname
  end

Το attr_writer δημιουργεί μεθόδους για να θέτεις τιμές

def fname=(first_name)
  @fname = first_name
end

Και τέλος το attr_accessor δημιουργεί και τους δύο τύπους.

Κωνσταντίνος

2009/9/6 louposk <lou...@gmail.com>

Nikos Kokkos

unread,
Sep 7, 2009, 1:53:49 AM9/7/09
to Ruby Hellug

Γειά σου,

αν έχεις χρησιμοποιήσει ποτέ Java, τότε οι συναρτήσεις attr_accessor,
attr_reader και attr_writer κάνουν ότι κάνουν και οι setter και getter
methods για τις μεταβλητές
σου όταν μέσα στην κλάση σου. Απλώς εδώ με την Ruby, δεν χρειάζεται να
γράψεις τον κώδικα.
Στον περέχει η Ruby.

PanosJee

unread,
Sep 7, 2009, 5:30:50 AM9/7/09
to Ruby Hellug
Επίσης καλό είναι να ξέρεις αν χρειάζεσαι σε ένα ActiveRecord μοντέλο
κάποιο extra πεδίο που δεν να αποθηκεύεται στη βάση με αυτές τις
μεθόδους μπορείς να το δημιουργήσεις

louposk

unread,
Sep 13, 2009, 12:00:57 PM9/13/09
to Ruby Hellug

Παιδια σας ευχαριστώ όλους με τις απαντήσεις σας, μπορώ να πω οτι το
κατάλαβα και με το παραπάνω.
@Vtypal: Πολύ αναλυτική εξήγηση
@Konstantinos: έχεις κάνει ένα λάθος στον κώδικά σου νομίζω εκεί που
καλείς τις μεθόδους έβαλες ένα p παραπανίσιο
@Nikoς: δεν έχω ασχολήθεί ιδιαίτερα με Java ίσως γιαυτό δεν μπορούσα
να καταλάβω την χρήση τους.
@Panos: αυτό ομολογώ οτι δεν το ήξερα

Thanx

Reply all
Reply to author
Forward
0 new messages