কম্পিউটার টিউটোরিয়াল

রুবি Struct ও OpenStruct: দক্ষ ভ্যালু অবজেক্টস

রুবিতে Struct কী?

একটি struct হলো একটি বিল্ট-ইন রুবি ক্লাস, এটি ভ্যালু অবজেক্ট তৈরি করার জন্য নতুন ক্লাস তৈরি করতে ব্যবহৃত হয়। একটি ভ্যালু অবজেক্ট সম্পর্কিত অ্যাট্রিবিউটগুলো একসাথে সংরক্ষণ করতে ব্যবহৃত হয়।

এখানে একটি উদাহরণ:

দুটি কোঅর্ডিনেট (x এবং y) সহ একটি Point।

আপনি এই ডেটাকে অনেক ভিন্নভাবে রিপ্রেজেন্ট করতে পারেন।

যেমন:

  • একটি অ্যারে [10, 20]
  • একটি হ্যাশ { x: 10, y: 10 }
  • একটি অবজেক্ট Point.new(10, 20)

যদি আপনার একাধিক Point থাকে, তবে অবজেক্ট অ্যাপ্রোচ ব্যবহার করা প্রায়শই ভালো অনুশীলন।

কিন্তু…

শুধু এই দুটি ভ্যালু একসাথে রাখার জন্য আপনি একটি সম্পূর্ণ ক্লাস তৈরি করতে চাইবেন না!

Struct ব্যবহার করে এই সমস্যাটি সমাধান হয়।

বিষয়বস্তু

  • 1 রুবিতে Struct তৈরি করার উপায়
    • 1.1 বিকল্প উপায়
    • 1.2 বড় সুবিধা
  • 2 রুবি Struct ব্যবহার করা
  • 3 সতর্কতা: Struct কঠিন হতে পারে
    • 3.1 আরেকটি বিচিত্র জিনিস
  • 4 রুবি ২.৫-এ নামযুক্ত প্যারামিটার
  • 5 OpenStruct ব্যবহার করা
  • 6 Struct বনাম OpenStruct
  • 7 ভিডিও টিউটোরিয়াল দেখুন
  • 8 উপসংহার
    • 8.1 সম্পর্কিত

চলুন শুরু করি!

রুবিতে Struct তৈরি করার উপায়

আপনি new কল করে এবং সিম্বলের একটি লিস্ট পাস করে একটি Struct তৈরি করতে পারেন যেগুলো এই ক্লাসের ইনস্ট্যান্স ভেরিয়েবল হয়ে যাবে।

সেগুলোর ডিফল্টভাবে এক্সেসর মেথড থাকবে, পড়া এবং লেখা দুটির জন্য।

এখানে একটি উদাহরণ:

 Person = Struct.new(:name, :age, :gender) 

এখন আপনি অবজেক্ট তৈরি করতে পারেন এভাবে:

 john = Person.new "john", 30, "M" david = Person.new "david", 25, "M" 

বিকল্প উপায়

আপনি Struct তৈরির এই অন্য উপায়টি জংলে পেতে পারেন।

এটি এরকম দেখায়:

 class Person < Struct.new(:name, :age, :gender) end 

আমি এটি রিকমেন্ড করি না।

কিন্তু আপনি যদি এটিকে বাইরে পান তবে এখন আপনি জানেন এটি কী করে।

বড় সুবিধা

Struct-এর একটি ভালো দিক হলো আপনি সেগুলোকে সরাসরি কমপেয়ার করতে পারেন, তাদের অ্যাট্রিবিউটের ভিত্তিতে।

উদাহরণ:

 john == john # true 

যদি এটি একটি সাধারণ রুবি অবজেক্ট হতো তবে আপনাকে নিজে == মেথড ডিফাইন করতে হতো।

এটিকে আমরা "ভ্যালু অবজেক্ট" বলি।

রুবি Struct ব্যবহার করা

অ্যারে বা হ্যাশের চেয়ে Struct ব্যবহার করার একটি বড় সুবিধা হলো আপনি স্ট্রাক্ট মেম্বারগুলোকে মেথড দিয়ে অ্যাক্সেস করতে পারেন।

উদাহরণস্বরূপ:

 puts john.age # 30 puts david.gender # "M" 

এটি সহায়ক কারণ যদি আপনার অবজেক্টের একটি অ্যারে থাকে, তবে আপনি max, select, sum ইত্যাদি মেথড ব্যবহার করতে পারেন।

উদাহরণ:

 [john, david].max_by(&:age) 

সুন্দর!

সতর্কতা: Struct কঠিন হতে পারে

Struct-জেনারেটেড ক্লাসের আরেকটি চাঁদা হলো…

সেগুলো কনস্ট্রাক্টরের জন্য সঠিক সংখ্যক আর্গুমেন্ট এনফোর্স করে না!

আমি ব্যাখ্যা করছি।

একটি সঠিক ক্লাসের সাথে আপনি এই ত্রুটি দেখবেন:

 ArgumentError: wrong number of arguments (0 for 3) 

কিন্তু আপনি যদি Struct ব্যবহার করেন তবে মিসিং আর্গুমেন্টগুলো nil হবে:

 Person.new("peter") # struct Person name="peter", age=nil, gender=nil 

Struct অবজেক্টের সাথে কাজ করার সময় এটিকে মনে রাখুন!

আরেকটি বিচিত্র জিনিস

এটি দেখুন…

 Struct.new(:a).ancestors [#, Struct, Enumerable, Object, Kernel, BasicObject] 

এই # হলো Struct-এ যোগ করা একটি অ্যানোনিমাস ক্লাস, এছাড়াও Enumerable মডিউল লক্ষ্য করুন, যা আপনাকে each ও map এর মতো মেথড কল করতে দেয়।

রুবি ২.৫-এ নামযুক্ত প্যারামিটার

মান लीজिए আপনি একটি ফাইল থেকে লাইন পড়ছেন এবং প্রতিটি লাইন একটি আইটেম রিপ্রেজেন্ট করে।

উদাহরণ:

 200 /login 18:00 404 /bacon 18:03 200 /books 18:04 

আপনি এই ডেটার সাথে আরও সহজে কাজ করতে পারেন যদি আপনি একটি কাস্টম ক্লাস তৈরি করেন।

এভাবে:

 LogEntry = Struct.new(:status, :url, :time) LogEntry.new(200, '/books', '18:04') 

তবে প্রতিটি আর্গুমেন্ট কী রিপ্রেজেন্ট করে সেটি এক্সট্রা স্পষ্ট করতে আপনি কীওয়ার্ড আর্গুমেন্ট ব্যবহার করতে চাইতে পারেন।

খুশির খবর!

রুবি ২.৫ Struct অবজেক্টে কীওয়ার্ড আর্গুমেন্টের জন্য সাপোর্ট যোগ করেছে।

এখানে কীভাবে ব্যবহার করবেন:

 LogEntry = Struct.new(:status, :url, :time, keyword_init: true) LogEntry.new(status: 200, url: '/books', time: '18:04') 

এখন আপনি আপনার ফাইল পার্স করতে পারেন এবং এটিকে LogEntry অবজেক্টে রূপান্তর করতে পারেন!

OpenStruct ব্যবহার করা

আপনি যদি শুধু একটি এককালীন অবজেক্ট দরকার হয়, তবে আপনাকে OpenStruct বিবেচনা করা উচিত।

কোড উদাহরণ:

 require 'ostruct' cat = OpenStruct.new(color: 'black') puts cat.class puts cat.color 

লক্ষ্য করুন ostruct রিকওয়ায়ার করতে হচ্ছে এই ক্লাস পেতে।

সতর্কতা: OpenStruct ধীর এবং প্রোডাকশন অ্যাপ্লিকেশনে ব্যবহার করা উচিত নয়, schneems-এর এই রেডডিট কমেন্ট অনুযায়ী। এছাড়াও আমি এই ব্লগ পোস্টটি পেয়েছি যেটিতে কিছু বেঞ্চমার্ক আছে যা এটিকে সমর্থন করে।

Struct বনাম OpenStruct

Struct এবং OpenStruct-এর পার্থক্য:

  • Struct নতুন একটি ক্লাস তৈরি করে पूर्वনির্ধারিত অ্যাট্রিবিউট, সমতা মেথড (==) এবং Enumerable সহ
  • OpenStruct দেওয়া অ্যাট্রিবিউটসহ নতুন একটি অবজেক্ট তৈরি করে

একটি OpenStruct হলো একটি ফ্যান্সি Hash অবজেক্ট, যখন Struct হলো একটি টেমপ্লেট থেকে নতুন একটি ক্লাস তৈরি করার মতো।

ভিডিও টিউটোরিয়াল দেখুন

উপসংহার

আপনি রুবি Struct এবং OpenStruct সম্পর্কে শিখেছেন! যতক্ষণ আপনি এই ক্লাসগুলোর বিশেষ বৈশিষ্ট্যগুলোর प्रति সচেতন থাকবেন ততক্ষণ আপনি ভালো থাকবেন।

রুবি Struct ও OpenStruct: দক্ষ ভ্যালু অবজেক্টস

এখন আপনার পালা প্র্যাকটিস করার 🙂


  1. রুবির `select` মেথড মাস্টার করুন: প্র্যাক্টিক্যাল উদাহরণ ও ব্যবহার গাইড

  2. রুবিতে Rake মাস্টার করুন: টাস্ক অটোমেশন-এর সম্পূর্ণ গাইড

  3. রুবি ম্যাট্রিক্স বুঝতে: ডেফিনিশন, অ্যাপ্লিকেশন এবং কীভাবে তৈরি করবেন

  4. রুবি মাস্টারিং: মেথড এলিয়াস তৈরি করার জন্য Alias কিওয়ার্ড ব্যবহার