Παγκόσμιες μεταβλητές είναι μεταβλητές που μπορεί να έχουν πρόσβαση από οπουδήποτε στο πρόγραμμα, ανεξάρτητα από το πεδίο εφαρμογής. Σημειώνονται ξεκινώντας με χαρακτήρα $ (σημάδι δολαρίου). Ωστόσο, η χρήση των παγκόσμιων μεταβλητών θεωρείται συχνά "un-Ruby", και σπάνια θα τις δείτε.
Ορισμός συνολικών μεταβλητών
Οι συνολικές μεταβλητές ορίζονται και χρησιμοποιούνται όπως κάθε άλλη μεταβλητή. Για να τα ορίσετε, απλώς ορίστε μια τιμή σε αυτά και αρχίστε να τα χρησιμοποιείτε. Αλλά, όπως υποδηλώνει και το όνομά τους, η ανάθεση σε παγκόσμιες μεταβλητές από οποιοδήποτε σημείο του προγράμματος έχει παγκόσμιες επιπτώσεις. Το παρακάτω πρόγραμμα δείχνει αυτό. Η μέθοδος θα τροποποιήσει μια παγκόσμια μεταβλητή, και αυτό θα επηρεάσει τον τρόπο με τον οποίο δεύτερος τρέχει η μέθοδος.
$ speed = 10. επιταχύνετε. $ ταχύτητα = 100. τέλος. def pass_speed_trap. αν η ταχύτητα $> 65. # Δώστε στο πρόγραμμα ένα εισιτήριο επιτάχυνσης. τέλος. τέλος. επιταχύνω. pass_speed_trap.
Μη δημοφιλής
Γιατί λοιπόν είναι αυτό το "un-Ruby" και γιατί δεν βλέπετε πολύ συχνά τις παγκόσμιες μεταβλητές; Με απλά λόγια, σπάει το εγκλεισμό. Εάν οποιαδήποτε κλάση ή μέθοδος μπορεί να τροποποιήσει την κατάσταση των συνολικών μεταβλητών κατά βούληση χωρίς στρώμα διεπαφής, οποιαδήποτε άλλες κατηγορίες ή μέθοδοι που βασίζονται σε αυτή την παγκόσμια μεταβλητή μπορεί να συμπεριφέρονται με ένα απροσδόκητο και ανεπιθύμητο τρόπος. Επιπλέον, τέτοιες αλληλεπιδράσεις μπορεί να είναι πολύ δύσκολο να διορθωθούν. Τι άλλαξε αυτή η παγκόσμια μεταβλητή και πότε; Θα αναζητήσετε αρκετό κώδικα για να βρείτε τι έκανε, και αυτό θα μπορούσε να αποφευχθεί αν δεν παραβιάσετε τους κανόνες εγκλεισμού.
Αλλά αυτό δεν σημαίνει ότι οι παγκόσμιες μεταβλητές είναι ποτέ που χρησιμοποιείται στο Ruby. Υπάρχουν ορισμένοι ειδικοί παγκόσμιοι μεταβλητές με ονόματα ενός χαρακτήρα (a-la Perl) που μπορούν να χρησιμοποιηθούν σε όλο το πρόγραμμά σας. Αντιπροσωπεύουν την κατάσταση του ίδιου του προγράμματος, και κάνουν πράγματα όπως να τροποποιούν τους διαχωριστές των δίσκων και των πεδίων για όλους παίρνει μεθόδων.
Παγκόσμιες μεταβλητές
- $0 - Αυτή η μεταβλητή, σημειωμένη με $ 0 (που είναι μηδέν), περιέχει το όνομα του σεναρίου κορυφαίου επιπέδου που εκτελείται. Με άλλα λόγια, το αρχείο δέσμης ενεργειών που εκτελέστηκε από το γραμμή εντολών, όχι το αρχείο δέσμης ενεργειών που περιέχει τον τρέχοντα κώδικα εκτέλεσης. Οπότε αν script1.rb εκτελέστηκε από τη γραμμή εντολών, θα κρατήσει script1.rb. Εάν απαιτείται αυτό το σενάριο script2.rb, $ 0 σε αυτό το αρχείο δέσμης ενεργειών θα είναι επίσης script1.rb. Το όνομα $ 0 αντικατοπτρίζει τη σύμβαση ονοματοποίησης που χρησιμοποιείται στο script shell UNIX για τον ίδιο σκοπό.
- $* - Τα επιχειρήματα της γραμμής εντολών σε μια συστοιχία που υποδηλώνεται με $ * (σύμβολο δολαρίου και αστερίσκο). Για παράδειγμα, εάν έπρεπε να τρέξετε ./script.rb arg1 arg2, τότε το $ * θα ισοδυναμεί με % w {arg1 arg2}. Αυτό είναι ισοδύναμο με το ειδικό ARGV και έχει ένα λιγότερο περιγραφικό όνομα, επομένως σπάνια χρησιμοποιείται.
- $$ - Το αναγνωριστικό διαδικασίας διεκπεραιωτή, που υποδηλώνεται από $$ (δύο πινακίδες δολαρίου). Η γνώση του δικού του αναγνωριστικού διαδικασίας είναι συχνά χρήσιμη σε προγράμματα δαίμονα (τα οποία εκτελούνται στο παρασκήνιο, μη συνδεδεμένα από οποιοδήποτε τερματικό) ή σε υπηρεσίες συστήματος. Ωστόσο, αυτό γίνεται λίγο πιο περίπλοκο όταν εμπλέκονται τα νήματα, οπότε προσέξτε να το χρησιμοποιήσετε τυφλά.
- $ / και $ \ - Αυτοί είναι οι διαχωριστές εγγραφών εισόδου και εξόδου. Όταν διαβάζετε αντικείμενα χρησιμοποιώντας παίρνει και να τα εκτυπώσετε χρησιμοποιώντας θέτει, χρησιμοποιεί αυτά για να ξέρει πότε έχει διαβαστεί ένα πλήρες "ρεκόρ" ή τι να εκτυπώνει μεταξύ πολλών αρχείων. Από προεπιλογή, αυτά πρέπει να είναι ο χαρακτήρας νέας γραμμής. Αλλά επειδή αυτά επηρεάζουν τη συμπεριφορά όλων των αντικειμένων IO, σπανίως χρησιμοποιούνται, αν όχι καθόλου. Μπορεί να τα δείτε σε μικρότερα σενάρια όπου η παραβίαση των κανόνων εγκλωβισμού δεν αποτελεί πρόβλημα.
- $? - Η κατάσταση εξόδου της διαδικασίας του τελευταίου παιδιού που εκτελέστηκε. Από όλες τις μεταβλητές που αναφέρονται εδώ, αυτό είναι ίσως το πιο χρήσιμο. Ο λόγος για αυτό είναι απλός: δεν μπορείτε να πάρετε την κατάσταση εξόδου των παιδικών διαδικασιών με την αξία επιστροφής τους από το Σύστημα μέθοδο, μόνο αλήθεια ή ψευδής. Εάν πρέπει να γνωρίζετε την πραγματική αξία επιστροφής της διαδικασίας του παιδιού, πρέπει να χρησιμοποιήσετε αυτήν την ειδική παγκόσμια μεταβλητή. Και πάλι, το όνομα αυτής της μεταβλητής λαμβάνεται από τα κελύφη UNIX.
- $_ - Η τελευταία συμβολοσειρά που διαβάζεται από παίρνει. Αυτή η μεταβλητή μπορεί να είναι ένα σημείο σύγχυσης για όσους έρχονται στο Ruby από την Perl. Στην Perl, το $ _ μεταβλητή σημαίνει κάτι παρόμοιο, αλλά τελείως διαφορετικό. Στην Perl, $_ διατηρεί την τιμή της τελευταίας δήλωσης και στην Ruby διατηρεί την συμβολοσειρά που επέστρεψε με την προηγούμενη παίρνει επίκληση. Η χρήση τους είναι παρόμοια, αλλά αυτό που πραγματικά κατέχουν είναι πολύ διαφορετικό. Δεν βλέπετε συχνά αυτή τη μεταβλητή (συμβουλευτείτε, σπάνια δείτε κάποια από αυτές τις μεταβλητές), αλλά μπορείτε να τις δείτε σε πολύ σύντομα προγράμματα Ruby που επεξεργάζονται κείμενο.
Εν ολίγοις, θα δείτε σπάνια τις μεταβλητές του πλανήτη. Είναι συχνά κακές μορφές (και "un-Ruby") και μόνο πραγματικά χρήσιμες σε πολύ μικρά σενάρια, όπου η πλήρης επίπτωση της χρήσης τους μπορεί να εκτιμηθεί πλήρως. Υπάρχουν μερικές ειδικές παγκόσμιες μεταβλητές που μπορούν να χρησιμοποιηθούν, αλλά ως επί το πλείστον δεν χρησιμοποιούνται. Δεν χρειάζεται πραγματικά να γνωρίζετε όλα αυτά σχετικά με τις παγκόσμιες μεταβλητές για να κατανοήσετε τα περισσότερα προγράμματα Ruby, αλλά πρέπει τουλάχιστον να ξέρετε ότι είναι εκεί.