(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f), })(window,document,'script','dataLayer','GTM-5LLHNRP9'),; thecodest, Συγγραφέας στο The Codest - Σελίδα 13 από 13

Βασικές λύσεις

Ας υποθέσουμε ότι χρησιμοποιούμε την κλάση Foo που έχει μία δημόσια μέθοδο και μία ιδιωτική μέθοδο:

κλάση Foo
  def bar
    :awesome
  end

  private

  def baz
    :something_private
  end
end

Όλα είναι υπέροχα, βλέπουμε μια τέτοια λύση σχεδόν σε κάθε έργο. Εκτέλεση Foo.new.baz θα προκαλέσει το σφάλμα NoMethodError (κλήση της ιδιωτικής μεθόδου 'baz' για το # ) και αυτό ήταν που θέλαμε να κάνουμε. Τι θα συμβεί αν προσπαθήσουμε να αλλάξουμε τη μορφή αποθήκευσης και προσθέσουμε το private ως πρόθεμα στον ορισμό της κλάσης;

κλάση Foo
  def bar
    :awesome
  end

  private def baz
    :something_private
  end
end

Όπως μπορείτε να δείτε μετά την εκτέλεση του κωδικός, λειτουργεί πραγματικά! Γιατί μπορούμε να εισάγουμε την ορατότητα της μεθόδου πριν την εκτελέσουμε; Επειδή κατά τον ορισμό μιας μεθόδου, η def επιστρέφει το όνομα της μεθόδου ως σύμβολο. Αυτή η έκφραση δεν είναι μόνο ένα μέρος της σύνταξης, αλλά de facto μια μέθοδος που προέρχεται από την κλάση Module και αντιμετωπίζει αυτό το σύμβολο ως όρισμα. Για περισσότερες πληροφορίες, ανατρέξτε στην τεκμηρίωση σε αυτόν τον σύνδεσμο. Αφού ξεκίνησε τόσο εύκολα με την private, ας προσπαθήσουμε να αλλάξουμε την ορατότητα της private μεθόδου.

κλάση Foo
  def bar
    :awesome
  end

  private def baz
    :something_private
  end

  public :baz
end

Τι θα συμβεί μετά την εκτέλεση του κώδικα;

irb(main):012:0> Foo.new.baz
=> :something_private

Επιτυχία! Η μέθοδος των βάσεων μας έγινε δημόσια επειδή την κάναμε ορατή δύο φορές. Φυσικά, η ίδια λειτουργία ισχύει και για τις ενότητες.

Υπέροχα, αλλά πού γίνεται us?

Αυτή η λειτουργικότητα μας δίνει πολλά γιατί μπορούμε να αλλάξουμε ελεύθερα την ορατότητα μιας μεθόδου κατά τον ορισμό της, ή ακόμα και να αλλάξουμε την ορατότητα των μεθόδων όταν τις κληρονομούμε.

Τώρα, ας ρίξουμε μια ματιά στο τι Ruby 2.7 μπορεί να κάνει όσον αφορά την αλλαγή της ορατότητας των ψευδωνύμων και των προσπελάσεων.

κλάση Foo
  private attr_accessor :awesome_variable
end

Δυστυχώς, λαμβάνουμε ένα σφάλμα καθώς η ιδιωτική μέθοδος αναμένει σύμβολα και attr_accessor. Ο κώδικας επιστρέφει nil και έτσι αυτή η μέθοδος δεν είναι συμβατή με τη χρήση private στη Ruby 2.7. Ποιες είναι λοιπόν οι επιλογές μας;

  1. Μπορούμε να χρησιμοποιήσουμε το attr_accessor κάτω από τη λέξη-κλειδί private για να το κάνουμε να λειτουργήσει, δηλαδή θα λάβουμε ένα σφάλμα όταν θέλουμε να αναφερθούμε στο φοβερή_μεταβλητήφοβερή_μεταβλητή μέθοδος.
κλάση Foo
  private

  attr_accessor :awesome_variable
end
  1. Η δεύτερη επιλογή είναι η εκτέλεση της ιδιωτικής μεθόδου σε μεθόδους που παράγονται από attr_attribute; σε αυτή την περίπτωση, πρέπει επίσης να θυμηθούμε να εισάγουμε τον ρυθμιστή εκεί.
κλάση Foo
  attr_accessor :awesome_variable

  private :awesome_variable, :awesome_variable=
end

Προβλήματα με το attr_ * οι μέθοδοι δεν είναι τα μόνα εμπόδια. Μπορούμε να αντιμετωπίσουμε την ίδια δυσκολία όταν θέλουμε να δημιουργήσουμε ένα ιδιωτικό ψευδώνυμο.

κλάση Foo
  private alias :bar, :awesome_bar
end

Το Ruby 3.0 και η επιχείρησή μας

Ευτυχώς, η Ruby 3.0 εισάγει μια μεγάλη αλλαγή, καθώς οι μέθοδοι ορατότητας μπορούν να λάβουν πίνακα ως όρισμα και το ψευδώνυμο των μεθόδων, attr_ *, μπορεί να επαναφέρει τον πίνακα με τα ονόματα των μεθόδων που έχουν οριστεί. Μπορείτε να διαβάσετε περισσότερα εδώ.

Τώρα, ας δούμε μερικά παραδείγματα στο τελευταίο euba και ας ελέγξουμε αν οι αλλαγές έχουν πράγματι γίνει και πώς μπορούμε να τις χρησιμοποιήσουμε.

Στο πρώτο παράδειγμα, ας χρησιμοποιήσουμε το private πριν από τον προσπελάτη attr:

κλάση Foo
  private attr_accessor :awesome_variable
end

Μια τέτοια κλήση δεν θα προκαλέσει σφάλματα κατά την ανάλυση της σύνταξης και, το σημαντικότερο, η awesome_variable καιawesome_variable =οι μέθοδοι γίνονται ιδιωτικές.

Η μέθοδος alias θα κάνει το ίδιο, καθώς τώρα επιστρέφει επίσης ένα σύμβολο ως όνομα της νέας μεθόδου και το καθιστά ορατό.

κλάση Foo
  private alias :bar, :awesome_bar
end

Ένα ενδιαφέρον γεγονός είναι ότι μπορούμε επίσης να εμβαθύνουμε σε περαιτέρω μεθόδους, π.χ. το φοβερόΗ ενότητα print μπορεί να κληθεί μεταξύ των private και attrαναγνώστη- είναι σημαντικό μια τέτοια μέθοδος να επιστρέφει έναν πίνακα με τα ονόματα των μεθόδων που βρίσκονται στη δεξιά πλευρά της έκφρασης.

κλάση Module
  def awesome_print(names)
    puts names
    names
  end
end
κλάση Foo
  private awesome_print attr_reader :awesome_bar
end 

Περίληψη

Ελπίζω να βρείτε αυτό το άρθρο χρήσιμο! Σε περίπτωση περισσότερων ειδήσεων σχετικά με το Ruby 3.0. διαβάστε περισσότερα εδώ.

Καλή κωδικοποίηση!

Προσφορά Ruby Developer

Διαβάστε περισσότερα:

Σκάσε και πάρε τα λεφτά σου #1: Κρυφό κόστος και πραγματική ευελιξία στη διαδικασία ανάπτυξης προϊόντων

Προκλήσεις CTO - κλιμάκωση και ανάπτυξη προϊόντων λογισμικού

elGreek