Εν

Ενότητες σε Crystal

1 άσκηση

Σχετικά με την έννοια Ενότητες

Οι ενότητες στη Crystal εξυπηρετούν δύο σκοπούς:

Ο πρώτος σκοπός είναι να δημιουργούν έναν χώρο ονομάτων για να αποφεύγονται οι συγκρούσεις ονομάτων. Ωστόσο, ομαδοποιούν και τον κώδικα, κάνοντας πιο εύκολο να καταλάβεις για τι χρησιμεύει ο κώδικας.

Ο δεύτερος σκοπός είναι να ορίζουν mixin για να μοιράζουν κώδικα σε τύπους.

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

Για να δηλώσεις μια ενότητα, χρησιμοποιείς τη λέξη-κλειδί module ακολουθούμενη από το όνομα της ενότητας.

module Foo
end

Χώρος ονομάτων

Ένας χώρος ονομάτων είναι ένας τρόπος να ομαδοποιείς κώδικα. Έτσι αποφεύγονται οι συγκρούσεις ονομάτων και γίνεται πιο εύκολο να καταλάβεις για τι χρησιμεύει ο κώδικας. Όταν θέλεις να προσπελάσεις μια σταθερά ή μια κλάση που έχει τοποθετηθεί μέσα σε έναν χώρο ονομάτων, χρησιμοποιείς τον τελεστή ::.

module Foo
  class Bar
  end
end

Foo::Bar.new

Χρήση ως mixin

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

Υπάρχουν δύο διαφορετικοί τρόποι να χρησιμοποιήσεις μια ενότητα ως mixin: ο πρώτος είναι να χρησιμοποιήσεις τη λέξη-κλειδί include και ο δεύτερος είναι να χρησιμοποιήσεις τη λέξη-κλειδί extend.

Και οι δύο μέθοδοι κάνουν τις σταθερές διαθέσιμες στον τύπο που συμπεριλαμβάνει ή επεκτείνει την ενότητα.

Include

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

module Foo
  def foo
    "foo"
  end
end

class Bar
  include Foo
end

Bar.new.foo # => "foo"

Extend

Το Extend λειτουργεί παρόμοια με το Include, αλλά αντί να κάνει τις μεθόδους διαθέσιμες ως μεθόδους στιγμιότυπου, τις κάνει διαθέσιμες ως μεθόδους κλάσης. Η λέξη-κλειδί extend πρέπει να γραφτεί στην κορυφή του τύπου, ακολουθούμενη από το όνομα της ενότητας.

module Foo
  def foo
    "foo"
  end
end

class Bar
  extend Foo
end

Bar.foo # => "foo"

Extend self

Ένα τυπικό μοτίβο στη Crystal χρησιμοποιεί το μοτίβο extend self σε μια ενότητα. Έτσι, όλες οι μέθοδοι της ενότητας γίνονται διαθέσιμες ως μέθοδοι κλάσης στην ίδια την ενότητα. Αυτό σημαίνει ότι δε χρειάζεται να αναθέσεις κάθε μέθοδο στην ενότητα χρησιμοποιώντας τη σύνταξη def self.method_name.

module Foo
  extend self

  def foo
    "foo"
  end
end

Foo.foo # => "foo"
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Ενότητες

Η εξάσκηση είναι κλειδωμένη

Ξεκλείδωσε 2 ακόμη ασκήσεις για να εξασκηθείς στην έννοια Ενότητες