ভ্যারিয়েবল ডিক্লেয়ার করতে = অ্যাসাইনমেন্ট অপারেটর ব্যবহার করুন।
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
এই অনুশীলনীতে আপনি আপনার প্রিয় রান্নার বই থেকে একটি দুর্দান্ত লাসাগনা রান্না করতে সহায়ক কোড লিখবেন।
আপনার সামনে চারটি কাজ, যার সবগুলোই লাসাগনা রান্নায় ব্যয় হওয়া সময়ের সাথে সম্পর্কিত।
Lasagna ক্লাসে EXPECTED_MINUTES_IN_OVEN কনস্ট্যান্টটি ডিফাইন করুন, যা সংরক্ষণ করে লাসাগনাটি কত মিনিট ওভেনে থাকা উচিত।
রান্নার বই অনুযায়ী, ওভেনে প্রত্যাশিত সময় মিনিটে ৪০:
Lasagna::EXPECTED_MINUTES_IN_OVEN
# => 40
Lasagna#remaining_minutes_in_oven মেথডটি ডিফাইন করুন, যা লাসাগনা এখন পর্যন্ত কত মিনিট ওভেনে ছিল সেটি একটি প্যারামিটার হিসেবে নেয় এবং আগের কাজের ওভেনে প্রত্যাশিত সময় মিনিটের ভিত্তিতে রিটার্ন করে লাসাগনাটিকে আর কত মিনিট ওভেনে থাকতে হবে।
Lasagna.new.remaining_minutes_in_oven(30)
# => 10
Lasagna#preparation_time_in_minutes মেথডটি ডিফাইন করুন, যা আপনি লাসাগনায় যতগুলো স্তর যোগ করেছেন তার সংখ্যা একটি প্যারামিটার হিসেবে নেয় এবং তা প্রস্তুত করতে আপনার কত মিনিট লেগেছে সেটি রিটার্ন করে, ধরে নিয়ে যে প্রতিটি স্তর প্রস্তুত করতে ২ মিনিট লাগে।
Lasagna.new.preparation_time_in_minutes(2)
# => 4
Lasagna#total_time_in_minutes মেথডটি ডিফাইন করুন, যা দুটি নামযুক্ত প্যারামিটার নেয়: number_of_layers প্যারামিটারটি হলো আপনি লাসাগনায় যতগুলো স্তর যোগ করেছেন তার সংখ্যা, আর actual_minutes_in_oven প্যারামিটারটি হলো লাসাগনাটি কত মিনিট ওভেনে ছিল তার সংখ্যা।
মেথডটি রিটার্ন করবে লাসাগনা রান্নায় আপনার মোট কত মিনিট কাজ হয়েছে, যা হলো প্রস্তুতির সময় মিনিটে এবং এই মুহূর্তে লাসাগনাটি ওভেনে যত সময় কাটিয়েছে তার যোগফল।
number_of_layers = 3
actual_minutes_in_oven = 20
Lasagna.new.total_time_in_minutes(number_of_layers, actual_minutes_in_oven)
# => 26
Exercism-এ সাইন আপ করুন, Crystal ট্র্যাকের 26টি কনসেপ্ট142টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।