একটি রুবি ইন্টারপ্রেটার হলো একটি প্রোগ্রাম যা রুবি কোড পড়ে এবং রান করে।
কিন্তু...
আপনি কি জানতেন ডিফল্ট রুবি ইন্টারপ্রেটার (MRI)-র অনেক আকর্ষণীয় ও উপকারী কমান্ড-লাইন অপশন রয়েছে?
যেমন:
ruby -v
যেটি আপনি বর্তমানে যে রুবি ভার্সন ব্যবহার করছেন সেটি দেখাবে।
বা -e ফ্ল্যাগ যা আপনাকে একটু কোড সরাসরি রান করতে দেয়, ফাইল ছাড়া এবং irb-এ যেতে হয় না।
এভাবে:
ruby -e 'puts 123'
আপনি এই ফ্ল্যাগগুলো -h ব্যবহার করে খুঁজে পেতে পারেন।
--help দিয়ে কয়েকটি "হিডেন" ফ্ল্যাগও দেখতে পাবেন।
এখানে আমার মতে সবচেয়ে আকর্ষণীয় ফ্ল্যাগগুলো-এর একটি টেবিল:
| ফ্ল্যাগ | বিবরণ |
|---|---|
| -v | রুবি ভার্সন প্রিন্ট করে |
| -c | সিনট্যাক্স চেক |
| -e | কোড সরাসরি রান করে |
| -w | ওয়ার্নিংস ইনেবল করে |
| -r | একটি ফাইল/জেম রিকোয়ার করুন |
| -I | লোড পাথ এ ডিরেক্টরি যোগ করুন |
| --enable frozen-string-literal | সকল স্ট্রিং ফ্রিজ করুন |
| --dump parsetree | পার্স ট্রি দেখান |
চলুন এই ফ্ল্যাগগুলো থেকে কয়েকটিতে ফোকাস করি যাতে বুঝতে পারি কীভাবে কাজ করে!
সিনট্যাক্স চেক
আপনার কাছে কোড আছে এবং আপনি জানতে চান সিনট্যাক্সটি ঠিক কিনা, তবে আপনি -c CLI অপশন ব্যবহার করতে পারেন।
উদাহরণ:
ruby -c code_without_syntax_errors.rb # Syntax OK ruby -c code_with_syntax_errors.rb # syntax error, unexpected tIDENTIFIER, expecting end-of-input
সিম্পল, কিন্তু কাজ করে 🙂
কুইক রিকোয়ার
কখনো কখনো আপনি مؤقتভাবে একটি জেম রিকোয়ার করতে চান একটি রুবি প্রোগ্রামে, ফাইলের টপে "require" লিখতে না চাইলে।
যেমন একটি ডিবাগিং জেম।
উদাহরণ:
ruby -rpry code.rb
খুব হেল্পফুল!
ওয়ার্নিং ফ্ল্যাগ
ওয়ার্নিং ফ্ল্যাগ ব্যবহার করলে লিন্টিং ইনেবল হবে এবং আপনার কোডের সম্ভাব্য সমস্যাগুলো দেখাবে।
উদাহরণস্বরূপ, এই কোড:
p @test
ruby -w ব্যবহার করলে নিচের ওয়ার্নিং দেবে:
warning: instance variable @test not initialized
এটি একটি ভালো ওয়ার্নিং!
কারণ আপনি কদাচিত একটি ইনস্ট্যান্স ভেরিয়েবল ব্যবহার করার চেষ্টা করছেন সেটিকে কোনো মান দিয়ে না।
বা আপনার ইনস্ট্যান্স ভেরিয়েবল নামে টাইপো থাকতে পারে, যা এই ফ্ল্যাগ আপনাকে সমস্যা হওয়ার আগে খুঁজে বের করতে সাহায্য করবে।
সমাধান সিম্পল:
@test = nil
এখানে আরেকটি উদাহরণ:
c = 1
এটি দেবে:
warning: assigned but unused variable - c
এই ওয়ার্নিং ফিক্স করতে আপনি ভেরিয়েবলটি ডিলিট করতে পারেন অথবা ব্যবহার করতে পারেন।
এটি শুধু লোকাল ভেরিয়েবল-এর জন্য কাজ করে।
কিন্তু আপনাকে জানা উচিত যে ব্লক আর্গুমেন্টের ভিতরে অনইউজড আর্গুমেন্টকে আন্ডারস্কোর (_) দিয়ে রিপ্লেস করা "বেস্ট প্র্যাকটিস" মाना হয়।
উদাহরণ:
{ chocolate: 82 }.map { |k, _| k }
এটি রুবিতে একটি সাধারণ কনভেনশন।
_ কোনো স্পেশাল জিনিস নয়, এটি শুধু একটি বৈধ ভেরিয়েবল নাম হয়ে যায়।
আরও ওয়ার্নিং উদাহরণ
নিচের কোডের ফলাফল কোনো মেথড থেকে রিটার্ন হচ্ছে না, বা কোনো ভেরিয়েবলে অ্যাসাইন হচ্ছে না।
2 * 2
রুবি এভাবে সতর্ক করে:
warning: possibly useless use of * in void context
সমাধান?
ব্যবহারহীন স্টেটমেন্টটি ডিলিট করুন, বা একটি ভেরিয়েবলে অ্যাসাইন করুন।
এখন এই মেথডটি দেখুন:
def orange(weight, quantity) # ... end
orange কল করার বিভিন্ন পদ্ধতি আছে:
orange 100, 2 orange(100, 2) orange *[100, 2] orange(*[100, 2])
orange *[100, 2] ওয়ার্নিংস ইনেবল থাকলে ব্যবহার করলে আপনি পাবেন:
warning: '*' interpreted as argument prefix
কী হচ্ছে?
অ্যাম্বিগুইটি।
রুবি মনে করে আপনি orange * [100, 2] বোঝাচ্ছেন, orange *[100, 2] নয়।
* এবং [-এর মাঝপথে স্পেস থাকা কেনো فرق পাড়ায় কারণ স্পেস মিস থাকলে * অ্যারে সাথে অ্যাসোসিয়েট হয় (স্প্লাট অপারেটর), আর স্পেস থাকলে রুবি মনে করে * হলো একটি মেথড কল।
তাই হ্যাঁ, এই ক্ষেত্রে স্পেস মানে রাখে।
আপনি অন্য যেকোনো পদ্ধতিতে মেথড কল করে এই ওয়ার্নিং ফিক্স করতে পারেন।
এখন:
আপনার নিজের কোড -w ফ্ল্যাগ দিয়ে রান করুন এবং কিছু ওয়ার্নিং রিমুভ করে কোড উন্নত করুন 🙂
রিড-ইভ্যাল-প্রিন্ট-লুপ
আপনি সম্ভবত irb এবং pry-এর সাথে পরিচিত, এগুলোই হলো REPL।
-n ফ্ল্যাগ -e ফ্ল্যাগের সাথে কম্বাইন করলে খুব কম কোডে অনুরূপ ইফেক্ট পাওয়া যায়।
এখানে একটি উদাহরণ:
echo 'bacon\nchocolate\norange' | ruby -ne 'puts $_.upcase' # BACON # CHOCOLATE # ORANGE
এটি echo-র ইনপুট নেয়, তারপর প্রতিটি লাইনের জন্য আপনার কোড (puts $_.upcase) কল করে।
এখানে $_ হলো একটি স্পেশাল ভেরিয়েবল যাতে gets দ্বারা পড়া শেষ ইনপুট ভ্যালু থাকে।
ফ্রোজেন স্ট্রিং লিটারলস ফ্ল্যাগ
রুবি ২.৩ "ফ্রোজেন স্ট্রিং লিটারলস" "ম্যাজিক কমেন্ট" পরিচয় করিয়েছে।
এটি এমন দেখায়:
# frozen_string_literal: true
এটি আপনার সকল স্ট্রিং ফ্রিজ করে দেয়, যাতে সেগুলো ইমিউটেবল হয় (বদলানো যায় না)।
এটি করার আরেকটি পদ্ধতি হলো রুবি পাস করতে --enable frozen-string-literal ফ্ল্যাগ।
এই কোড:
str = "abcdef" str[0] = "b"
उस ফ্ল্যাগ ব্যবহার করলে এই এরর দেবে:
can't modify frozen String (FrozenError)
কিন্তু যদি আপনি স্ট্রিং পরিবর্তন করতে চান?
তখন আপনি এভাবে করতে পারেন:
str = "abcdef".dup
বা এভাবে:
str = +"abcdef"
দুটোই আপনাকে নন-ফ্রোজেন স্ট্রিং দেবে কাজ করার জন্য।
সারসংক্ষেপ
আপনি রুবির কমান্ড-লাইন অপশনগুলো সম্পর্কে শিখেছেন, যার মধ্যে ভার্সন ফ্ল্যাগ, ওয়ার্নিং ফ্ল্যাগ এবং ফ্রোজেন স্ট্রিং লিটারলস। এই সব ফ্ল্যাগ উপকারী হতে পারে, একবার চেষ্টা করুন!
এই আর্টিকেলটি শেয়ার করতে ভুলবেন না যাতে আরও মানুষ উপকৃত হয়।
পড়ার জন্য ধন্যবাদ 🙂