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

রুবি সিনট্যাক্টিক شوগার মাস্টার করুন: রিডেবিলিটি এবং এফিশিয়েন্সি বাড়ান

একটি নতুন রুবি ম্যাজিক আর্টিকেলে স্বাগতম! এই এপিসোডে, আমরা দেখব কীভাবে রুবি সিনট্যাক্টিক شوগার ব্যবহার করে তার কিছু সিনট্যাক্স আরও এক্সপ্রেসিভ বা পড়তে সহজ করে। শেষে, আমরা জানব রুবির কিছু ট্রিক কীভাবে হাড আন্ডারে কাজ করে এবং কীভাবে আমরা নিজেদের মেথড লিখব যা এই শুগার ব্যবহার করে।

রুবি অ্যাপ লিখার সময় ক্লাস অ্যাট্রিবিউট, অ্যারে এবং হ্যাশের সাথে ইন্টারঅ্যাক্ট করার একটি উপায়ে যা নন-স্ট্যান্ডার্ড লাগতে পারে। আমরা অ্যাট্রিবিউট অ্যাসাইন এবং অ্যারে বা হ্যাশ থেকে ভ্যালু ফেচ করার মেথড কীভাবে ডিফাইন করব?

রুবি কিছু সিনট্যাক্টিক شوগার প্রদান করে এই মেথডগুলোর কল করার সময় কাজ করার জন্য। এই পোস্টে আমরা এক্সপ্লোর করব কীভাবে সেটি কাজ করে।

person1 = Person.new
person1.name = "John"
array = [:foo, :bar]
array[1] # => :bar
hash = { :key => :foo }
hash[:key] # => :foo
hash[:key] = :value

সিনট্যাক্টিক শুগার?

সিনট্যাক্টিক শুগার বলতে রুবি আপনাকে দেওয়া ছোট্ট ✨ ম্যাজিক ✨ কে বোঝায় যা আপনাকে সহজে পড়া যাওয়া এবং সংক্ষিপ্ত কোড লিখতে সাহায্য করে। রুবিতে এর মানে কিছু সিম্বল, স্পেস বাদ দিতে বা কিছু এক্সপ্রেশন হেল্পারের সাথে লিখতে।

মেথড নাম

মেথড নাম দিয়ে শুরু করি। রুবিতে, আমরা সব ধরনের ক্যারেক্টার এবং স্পেশাল সিম্বল মেথড নামের জন্য ব্যবহার করতে পারি যা অন্যান্য ল্যাঙ্গুয়েজে কমনলি সাপোর্টেড নয়। আপনি যদি কখনো রেইলস অ্যাপ লিখেছেন, আপনি সম্ভবত save! মেথড দেখেছেন। এটি রেইলসের জন্য স্পেসিফিক নয়, বরং রুবি মেথড নামে ! ক্যারেক্টার সাপোর্ট দর্শায়।

এটি অন্যান্য সিম্বল যেমন =, [, ], ?, %, &, |, <, >, *, -, + এবং /-র জন্যও প্রযোজ্য।

এই ক্যারেক্টার সাপোর্টের মানে আমরা সেগুলো আমাদের মেথড namn এ ইনকর্পোরেট করতে পারি সেটা কী জন্য সেটা আরও এক্সপ্লিসিট করার জন্য:

  • অ্যাট্রিবিউট অ্যাসাইন করা: person.name = "foo"
  • প্রশ্ন করা: person.alive?
  • বিপজ্জনক মেথড কল: car.destroy!
  • অবজেক্টকে কিছু যেটা সেটি নয় সেটার মতো আচরণ করানো: car[:wheels]

অ্যাট্রিবিউট মেথড ডিফাইন করা

একটি ক্লাসে attr_accessor দিয়ে অ্যাট্রিবিউট ডিফাইন করলে, রুবি ক্লাসের একটি ইনস্ট্যান্স ভেরিয়েবলের জন্য একটি রিডার এবং একটি রাইটার মেথড তৈরি করে।

class Person
  attr_accessor :name
end
person = Person.new
person.name = "John"
person.name # => "John"

হাড আন্ডারে, রুবি দুটি মেথড তৈরি করে:

  • Person#name ক্লাসে অ্যাট্রিবিউট/ইনস্ট্যান্স ভেরিয়েবল পড়ার জন্য attr_reader ব্যবহার করে, এবং;
  • Person#name= ক্লাসে অ্যাট্রিবিউট/ইনস্ট্যান্স ভেরিয়েবল লিখতে attr_writer ব্যবহার করে।

এখন মান লেন আমরা এই বিহেভিয়ার কাস্টমাইজ করতে চাই। আমরা attr_accessor হেল্পার ব্যবহার করব না এবং নিজেরা মেথডগুলো ডিফাইন করব।

class AwesomePerson
  def name
    "Person name: #{@name}"
  end
  def name=(value)
    @name = "Awesome #{value}"
  end
end
person = AwesomePerson.new
person.name = "Jane"
person.name # => "Person name: Awesome Jane"

name= এর মেথড ডেফিনিশন প্রায় একইভাবে লেখা হয় যেভাবে আপনি মেথড কল করবেন person.name = "Jane"। আমরা ইকুয়ালস সাইন = এর চারপাশে স্পেস ডিফাইন করি না এবং মেথড কল করার সময় প্যারেন্থেসিস ব্যবহার করি না।

অপশনাল প্যারেন্থেসিস এবং স্পেস

আপনি লক্ষ্য করেছেন হয়তে পারে রুবিতে প্যারেন্থেসিস অনেক সময় অপশনাল। আর্গুমেন্ট একটি মেথডে পাস করার সময়, আমাদের আর্গুমেন্টকে প্যারেন্থেসিস () দিয়ে র‍্যাপ করতে হয় না, কিন্তু আমরা করি যদি পড়তে সহজ হয়।

if-স্টেটমেন্ট একটি ভালো উদাহরণ। অনেক ল্যাঙ্গুয়েজে আপনি if-স্টেটমেন্ট যেই এক্সপ্রেশন ইভ্যালুয়েট করে সেটি প্যারেন্থেসিস দিয়ে র‍্যাপ করেন। রুবিতে, সেগুলো ওমিট করা যায়।

puts "Hello!" if (true) # With optional parentheses
puts "Hello!" if true # Without parentheses

এটি মেথড ডেফিনিশন এবং অন্যান্য এক্সপ্রেশনের জন্যও প্রযোজ্য।

def greeting name # Parentheses omitted
  "Hello #{name}!"
end
greeting("Robin") # With parentheses
greeting "Robin" # Without parentheses
greeting"Robin" # Without parentheses and spaces

লাস্ট লাইন পড়তে কঠিন, কিন্তু কাজ করে। প্যারেন্থেসিস এবং স্পেস অপশনাল এমনকি মেথড কল করার সময়।

শুধু সাবধান থাকুন সব প্যারেন্থেসিস এবং স্পেস ওমিট না করার জন্য, কিছু এগুলো রুবি বুঝতে সাহায্য করে আপনি কী মানে! সন্দেহ হলে, আপনার আর্গুমেন্টগুলো প্যারেন্থেসিস দিয়ে র‍্যাপ করুন যাতে আপনি এবং রুবি জানেন কোন আর্গুমেন্ট কোন মেথড কলের。──

মেথড কল করার নিচের সব উপায় সাপোর্টেড, কিন্তু আমরা সাধারণত প্যারেন্থেসিস ওমিট করি এবং স্পেস যোগ করি কোড একটু বেশি রিডেবল করার জন্য।

# Previous method definition:
# def name=(value)
#   @name = "Awesome #{value}"
# end
person.name = "Jane"
person.name="Jane"
person.name=("Jane") # That looks a lot like the method definition!

আমরা এখন name অ্যাট্রিবিউটের জন্য কাস্টম রিডার এবং রাইটার মেথড ডিফাইন করেছি। আমরা বিহেভিয়ার কাস্টমাইজ করতে পারি প্রয়োজন অনুযায়ী এবং সরাসরি ভ্যালু ট্রান্সফর্ম করতে পারি অ্যাট্রিবিউট অ্যাসাইন করার সময় কালব্যাক ব্যবহার করার বদলে।

[ ] মেথড ডিফাইন করা

আরেকটা বিষয় যা আমরা দেখব হলো রুবিতে স্কোয়ার ব্র্যাকেট মেথড [ ]। এগুলো সাধারণত অ্যারে ইনডেক্স এবং হ্যাশ কী থেকে ভ্যালু ফেচ এবং অ্যাসাইন করতে ব্যবহৃত হয়।

hash = { :foo => :bar, :abc => :def }
hash[:foo] # => :bar
hash[:foo] = :baz # => :baz
array = [:foo, :bar]
array[1] # => :bar

আমরা দেখি এই মেথডগুলো কীভাবে ডিফাইন হয়। hash[:foo] কল করলে আমরা রুবি সিনট্যাক্টিক শুগার ব্যবহার করি সেটি কাজ করার জন্য। এটা লেখার অন্য একটি উপায়:

hash = { :foo => :bar }
hash.[](:foo)
hash.[]=(:foo, :baz)
# or even:
hash.send(:[], :foo)
hash.send(:[]=, :foo, :baz)

সামন্য লেখার সাথে তুলনা করলে (hash[:foo] এবং hash[:foo] = :baz) আমরা ইতিমধ্যে কিছু পার্থক্য দেখতে পাচ্ছি। প্রথম উদাহরণে (hash.[](:foo)) রুবি প্রথম আর্গুমেন্টকে স্কোয়ার ব্র্যাকেটের মাঝপথে মুভ করে (hash[:foo])। hash.[]=(:foo, :baz) কল করলে দ্বিতীয় আর্গুমেন্ট মেথডে ভ্যালু হিসেবে পাস হয় hash[:foo] = :baz।

এটা জানলে, আমরা এখন আমাদের নিজের [ ] এবং [ ]= মেথড ডিফাইন করতে পারি যেভাবে রুবি বুঝবে।

class MyHash
  def initialize
    @internal_hash = {}
  end
  def [](key)
    @internal_hash[key]
  end
  def []=(key, value)
    @internal_hash[key] = value
  end
end

এখন যেহেতু আমরা জানি এই মেথডগুলো নরমাল রুবি মেথড, আমরা একই লজিক অ্যাপ্লাই করতে পারি যেকোনো অন্য মেথডের মতো। আমরা এমনকি একটু ਵিয়ার্ড জিনিস করতে পারি যেমন [ ] মেথডে একাধিক কী আলাউ করা।

class MyHash
  def initialize
    @internal_hash = { :foo => :bar, :abc => :def }
  end
  def [](*keys)
    @internal_hash.values_at(*keys)
  end
end
hash = MyHash.new
hash[:foo, :abc] # => [:bar, :def]

আপনার নিজস্ব তৈরি করুন

এখন যেহেতু আমরা রুবির সিনট্যাক্টিক শুগার সম্পর্কে কিছুটা জানি, আমরা এই জ্ঞান অ্যাপ্লাই করতে পারি আমাদের নিজের মেথড তৈরি করতে যেমন কাস্টম রাইটার, হ্যাশ-লাইক ক্লাস এবং আরও।

আপনি আশ্চর্য করতে পারেন কতগুলো জেম মেথড ডিফাইন করে যেমন স্কোয়ার ব্র্যাকেট মেথড যাতে কিছু অ্যারে বা হ্যাশের মতো লাগে যখন সেটি আসলে সেটি নয়। একটি উদাহরণ হলো রেইলস অ্যাপ্লিকেশনে ফ্ল্যাশ মেসেজ সেট করা: flash[:alert] = "An error occurred"। অ্যাপসিগন্যাল জেমে আমরা নিজেদের Config ক্লাসে এটা ব্যবহার করি কনফিগারেশন ফেচ করার শর্টকাট হিসেবে।

এই রুবিতে মেথড ডেফিনিশন এবং কলিং-এর সিনট্যাক্টিক শুগারের সংক্ষিপ্ত লুক সমাপ্তি। আমরা জানতে চাই আপনি এই আর্টিকেল কেমন লাগলো, আপনার কোনো প্রশ্ন আছে কিনা, এবং আপনি কী নিয়ে পড়তে চান, তাই @AppSignal-এ আমাদের জানাতে ভুলবেন না।

  1. রুবি মেথড ব্যাখ্যা: কাস্টম ফাংশন সহজে তৈরি করুন

  2. রুবি ২.৬-এ ৯টি গুরুত্বপূর্ণ উন্নতির অন্বেষণ

  3. Ruby-এ TracePoint দিয়ে মেথড ট্রেস করা: একটি ব্যবহারিক গাইড

  4. রুবি অ্যারে 습득: প্র্যাক্টিক্যাল উদাহরণ এবং অপরিহার্য মেথডগুলো