Crystal में मॉड्यूल के दो उद्देश्य हैं:
पहला उद्देश्य है नामों के टकराव से बचने के लिए एक नेमस्पेस बनाना। लेकिन यह कोड को समूहों में भी बाँटता है, जिससे यह समझना आसान हो जाता है कि कोड किस काम का है।
दूसरा उद्देश्य है टाइप के साथ कोड साझा करने के लिए मिक्सिन परिभाषित करना।
मॉड्यूल क्लास जैसे होते हैं, लेकिन मुख्य अंतर यह है कि इनका इंस्टेंस नहीं बनाया जा सकता, और इसलिए इनमें इंस्टेंस वेरिएबल नहीं होते।
मॉड्यूल घोषित करने के लिए module कीवर्ड लिखा जाता है, जिसके बाद मॉड्यूल का नाम आता है।
module Foo
end
नेमस्पेस कोड को समूहों में बाँटने का एक तरीका है।
इससे नामों का टकराव टलता है और यह समझना आसान हो जाता है कि कोड किस काम का है।
जब किसी नेमस्पेस के अंदर रखे गए कॉन्स्टेंट या क्लास को एक्सेस करना हो, तो :: ऑपरेटर का उपयोग किया जाता है।
module Foo
class Bar
end
end
Foo::Bar.new
यह तब काम आता है जब, उदाहरण के लिए, कई क्लासों को एक ही "बेस" फंक्शनलिटी चाहिए हो, या जब असंबंधित क्लासों के बीच कोड साझा करना हो। या जब ऐसी क्लासों के बीच कोड साझा करना हो जिनका आपस में कोई संबंध नहीं है।
किसी मॉड्यूल को मिक्सिन के रूप में इस्तेमाल करने के दो तरीके हैं: पहला है include कीवर्ड का उपयोग करना, और दूसरा है extend कीवर्ड का उपयोग करना।
दोनों तरीके उस टाइप के लिए कॉन्स्टेंट उपलब्ध करा देते हैं जो मॉड्यूल को include या extend करता है।
Include करने पर मॉड्यूल के सारे मेथड उस टाइप पर इंस्टेंस मेथड के रूप में उपलब्ध हो जाते हैं।
include कीवर्ड टाइप के सबसे ऊपर लिखा जाना चाहिए, और उसके बाद मॉड्यूल का नाम।
module Foo
def foo
"foo"
end
end
class Bar
include Foo
end
Bar.new.foo # => "foo"
extend भी include की तरह ही काम करता है, लेकिन मेथड को इंस्टेंस मेथड के रूप में उपलब्ध कराने के बजाय यह उन्हें क्लास मेथड के रूप में उपलब्ध कराता है।
extend कीवर्ड टाइप के सबसे ऊपर लिखा जाना चाहिए, और उसके बाद मॉड्यूल का नाम।
module Foo
def foo
"foo"
end
end
class Bar
extend Foo
end
Bar.foo # => "foo"
Crystal में एक आम पैटर्न यह है कि मॉड्यूल के अंदर extend self पैटर्न का उपयोग किया जाए।
इससे मॉड्यूल के सारे मेथड मॉड्यूल पर ही क्लास मेथड के रूप में उपलब्ध हो जाते हैं।
इसका मतलब है कि आपको def self.method_name सिंटैक्स का उपयोग करके हर मेथड को मॉड्यूल में असाइन नहीं करना पड़ता।
module Foo
extend self
def foo
"foo"
end
end
Foo.foo # => "foo"