Crystal एक कंपाइल की जाने वाली, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषा है। भाषा के कुछ उद्देश्य ये हैं:
Crystal पर काम 2011 में इस उद्देश्य से शुरू हुआ कि एक ऐसी भाषा बनाई जाए जिसमें Ruby की सुंदरता और उत्पादकता हो, लेकिन एक कंपाइल की जाने वाली भाषा का प्रदर्शन और टाइप सुरक्षा भी हो। भाषा का कंपाइलर शुरू में Ruby में लिखा गया था, लेकिन 2013 में इसे Crystal में फिर से लिखा गया। Ary Borenszweig, Juan Wajnerman और Brian Cardiff ने इस भाषा को विकसित किया और इसका डिज़ाइन बनाया।
किसी वेरिएबल को घोषित करने के लिए = असाइनमेंट ऑपरेटर का इस्तेमाल कीजिए।
Crystal में वेरिएबल के नाम snake_case रूप में लिखे जाने चाहिए।
number = 1
puts number # => 1
number = 2
puts number # => 2
कॉन्स्टेंट भी उसी = असाइनमेंट ऑपरेटर से घोषित किए जाते हैं, लेकिन इनमें सभी अक्षर बड़े होते हैं, जिसे SCREAMING_SNAKE_CASE कहते हैं।
NUMBER = 1
puts NUMBER # => 1
पहले से घोषित कॉन्स्टेंट को कोई वैल्यू असाइन करने पर कंपाइल-टाइम एरर मिलती है।
NUMBER = 1
NUMBER = 2
# Error: already initialized constant NUMBER
Crystal एक कंपाइल की जाने वाली भाषा है, यानी कंपाइल के समय हर वेरिएबल या मेथड आर्गुमेंट को एक टाइप दिया जाता है। कंपाइलर किसी वेरिएबल या मेथड आर्गुमेंट का टाइप अनुमान लगा सकता है। लेकिन कुछ मामलों में टाइप बताना ज़रूरी होता है। किन मामलों में टाइप बताना ज़रूरी होता है, यह आगे के कॉन्सेप्ट में बताया जाएगा।
मेथड निर्देशों को एक साथ रखने का तरीका हैं, ताकि उन्हें दोबारा इस्तेमाल किया जा सके।
Crystal में मेथड अक्सर किसी क्लास, मॉड्यूल या स्ट्रक्ट के अंदर बनाए जाते हैं।
लेकिन मेथड किसी क्लास, मॉड्यूल या स्ट्रक्ट के बाहर भी बनाए जा सकते हैं।
मेथड def कीवर्ड से घोषित किए जाते हैं, और उसके बाद मेथड का नाम लिखा जाता है।
Crystal में मेथड snake_case में लिखे जाने चाहिए।
जब मेथड में कोई आर्गुमेंट न हो, तो आप ब्रैकेट छोड़ सकते हैं।
मेथड का अंत बताने के लिए end कीवर्ड का इस्तेमाल करना ज़रूरी है।
def hello
puts "Hello World!"
end
वेरिएबल या मेथड आर्गुमेंट के टाइप के लिए जो मेथड मौजूद नहीं है, उसे इस्तेमाल करने पर कंपाइल-टाइम एरर मिलती है।
number = 1
number + "1"
# Error: no overload matches 'Int32#+' with type String
मेथड में आर्गुमेंट हो सकते हैं। आर्गुमेंट वह डेटा हैं जो मेथड को दिया जाता है। मेथड को आर्गुमेंट देने के लिए आपको आर्गुमेंट का नाम बताना होता है। Crystal में आर्गुमेंट snake_case में लिखे जाने चाहिए। मेथड में एक से अधिक आर्गुमेंट हो सकते हैं, लेकिन आर्गुमेंट के बीच कॉमा होना चाहिए।
def hello(name)
puts "Hello #{name}!"
end
मेथड में एक से अधिक आर्गुमेंट भी हो सकते हैं। ऐसी स्थिति में आर्गुमेंट के बीच कॉमा होना ज़रूरी है।
def hello(name, language)
puts "Hello #{name}! You are learning #{language}."
end
जब आप किसी क्लास, मॉड्यूल या स्ट्रक्ट के मेथड को कॉल करते हैं, तो डॉट ऑपरेटर (.) का इस्तेमाल करना ज़रूरी है।
इसका रूप इस तरह होता है: <ClassName>.<method_name>.
जब कोई मेथड किसी क्लास, मॉड्यूल या स्ट्रक्ट का न हो, तो आप उसका नाम लिखकर सीधे कॉल कर सकते हैं।
मेथड हमेशा अंतिम एक्सप्रेशन की वैल्यू अपने आप लौटाते हैं।
जब मेथड में आर्गुमेंट हों, तो मेथड को कॉल करते समय और उसे बनाते समय आर्गुमेंट लिखने के लिए आप ब्रैकेट का इस्तेमाल कर सकते हैं, जैसे: <method_name>(<argument_1>, <argument_2>, ...).
जब मेथड में कोई आर्गुमेंट न हो, तो ब्रैकेट छोड़ दिए जाने चाहिए।
def hello(name)
"Hello #{name}!"
end
hello("Crystal")
# => Hello Crystal!
एक से अधिक आर्गुमेंट वाले मेथड को कॉल करते समय आर्गुमेंट के बीच कॉमा होना चाहिए। आर्गुमेंट उसी क्रम में देने होंगे जिस क्रम में मेथड में लिखे हैं।
def hello_language(name, language)
"Hello #{name}! You are learning #{language}."
end
hello_language("World", "Crystal")
# => Hello World! You are learning Crystal.
गलत संख्या में आर्गुमेंट के साथ मेथड को कॉल करने पर कंपाइल-टाइम एरर मिलती है।
hello_language("Crystal")
# wrong number of arguments for 'hello_language' (given 1, expected 2)
Crystal में आप + ऑपरेटर से दो संख्याओं को जोड़ सकते हैं।
आप - ऑपरेटर से दो संख्याओं को घटा सकते हैं।
और आप * ऑपरेटर से दो संख्याओं को गुणा कर सकते हैं।
1 + 1
# => 2
2 - 1
# => 1
2 * 2
# => 4
Crystal में कमेंट # अक्षर से लिखे जाते हैं, जिसके बाद एक स्पेस और फिर कमेंट लिखा जाता है।
कमेंट कोड का दस्तावेज़ बनाने के लिए इस्तेमाल किए जाते हैं।
कंपाइलर कमेंट को नहीं चलाता।
# This is a comment