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

রুবির স্প্ল্যাট অপারেটর দক্ষতা: সহজে অ্যারে তৈরি ও ম্যানিপুলেট করুন

রুবির যা একটি বিষয় আমাকে খুব ভালো লাগে সেটি হচ্ছে এর ফিচারগুলোর গভীরতা। আপনি একটি অপারেটর ব্যবহার করেন, কিন্তু একটু গভীরে যান তবে দেখবেন আপনি কেবল সতহি ছুঁয়েছেন যা সেটি করতে পারে তার। নম্র স্প্ল্যাট অপারেটর (* এবং **) এর একটি চমৎকার উদাহরণ।

আপনি সম্ভবত স্প্ল্যাট ব্যবহার করেছেন "catch-all" আর্গুমেন্টের জন্য। এবং বেশিরভাগ মানুষ শুধু এটিই ব্যবহার করে।

def go(x, *args)
  puts args.inspect
end
go("a", "b", "c")

আপনি যদি নতুন কিওয়ার্ড আর্গুমেন্ট সিনট্যাক্স ব্যবহার করেন, ডাবল স্প্ল্যাট ব্যবহার করুন:

def go(**params)
  puts params.inspect
end
go(x: 100, y: 200)

এটি উপকারী, কিন্তু স্প্ল্যাট আপনি আরও অনেক কাজে ব্যবহার করতে পারেন। ডুব দিই!

অ্যারে ব্যবহার করে একাধিক আর্গুমেন্ট পাস

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

def go(x, y)
end
point = [12, 10]
go(*point)

এবং ভুলবেন না যে নিউ স্টাইল কিওয়ার্ড আর্গুমেন্টের জন্য আপনি ডাবল স্প্ল্যাট ব্যবহার করতে পারেন:

def go(x:, y:)
end
point = { x: 100, y: 200 }
go(**point)

স্প্ল্যাট এন্ড-এ থাকতে হবে না

যদিও স্প্ল্যাট করা আর্গুমেন্টগুলো আর্গুমেন্ট লিস্টের শেষে রাখা কমন, কিন্তু এটিকে বাধ্য করার কোনো আইন নেই।

আপনি আর্গুমেন্ট লিস্টের যেকোনো জায়গায় স্প্ল্যাট রাখতে পারেন।

def go(x, *args, y)
  puts x # => 1
  puts y # => 5
  puts args.inspect # => [2,3,4]
end
go(1, 2, 3, 4, 5)

অ্যারে ডিস্ট্রাকচারিং

আর্গুমেন্টের সাথে এই সব ট্রিক আসলে অ্যারে ডিস্ট্রাকচারিংর একটি স্পেশাল কেস।

যদি আপনি "অ্যারে ডিস্ট্রাকচারিং" টার্মটি না জানেন, তবে এটি শুধু মানে একটি অ্যারে আলাদা আলাদা আইটেমে ভাঙা। এটা এইরকম দেখায়:

a, b = [1, 2]
puts a # 1
puts b # 2

এটি ভালো কাজ করে কিন্তু প্রতিটি আইটেম ধারণ করার জন্য ভেরিয়েবল নির্দিষ্ট করতে কষ্টদায়ক হতে পারে। স্প্ল্যাট অপারেটর এই সমস্যাটি সমাধান করে—এসেনশিয়ালি একটি ওয়াইল্ডকার্ডের মতো কাজ করে। কিছু উদাহরণ দেখি।

অ্যারে থেকে প্রথম আইটেম পপ

কখনও কখনও অ্যারে থেকে প্রথম আইটেম পপ করা উপকারী হয় মূল অ্যারে পরিবর্তন না করে। এটিই এই উদাহরণটি করে।

first, *remainder = [1, 2, 3, 4, 5]
first # => 1
remainder # => [2, 3, 4, 5]

আপনি যদি শুধু প্রথম আইটেম চান কিন্তু বাকি অ্যারেটি না চান, তবে এই সিনট্যাক্স ব্যবহার করুন:

first, * = [1, 2, 3, 4, 5]
first # => 1

শেষ আইটেম পপ

অ্যারে শেষ থেকে আইটেম বের করতে চাইলে, স্প্ল্যাটকে শুরুতে রাখুন:

*prefix, last = [1, 2, 3, 4, 5]
last # => 5
prefix # => [1, 2, 3, 4]

আবার, যদি আমরা স্পেসিফিক ভেরিয়েবল না চাই, তবে অ্যাসাইন করতে হবে না:

অ্যারে র প্রথম এবং শেষ n আইটেম পান

আপনি যদি স্প্ল্যাট অপারেটর মাঝপথে রাখেন, তবে আপনি অ্যারে প্রান্ত থেকে যেকোনো সংখ্যক আইটেম বের করতে পারেন।

first, *, last = [1, 2, 3, 4, 5]
first # => 1
last # => 5

সীমাবদ্ধতা

অ্যারে ডিস্ট্রাকচারিং-এ স্প্ল্যাট অপারেটর ব্যবহার করার সময় আপনাকে অ্যারে আইটেমের পজিশন শুরু এবং শেষের সাপেক্ষে স্পেসিফাই করতে হয়। তাই এটি লম্বা অ্যারের মাঝপথ থেকে আইটেম বের করার জন্য সেরা টুল নয়।

এছাড়া, ডাবল-স্প্ল্যাট (**) অপারেটর ব্যবহার করে হ্যাশ ম্যানিপুলেট করার কোনো কুল ট্রিক খুঁজে পেলাম না। বেশীরাম!

অ্যারে নির্মাণ

স্প্ল্যাট অপারেটর শুধু অ্যারে ডিস্ট্রাকচারিং-এই উপকারী নয়, বরং অ্যারে নির্মাণে ও উপকারী।

নিচের উদাহরণে, আমরা স্প্ল্যাট ব্যবহার করে দুটি অ্যারে জয়েন করছি।

[*[1,2], *[3,4]] # => [1, 2, 3, 4]

এটি [[1, 2], [3,4]].flatten-এর সমতুল্য।

যদি এটিই চেষ্টা হত, তবে এটি তত উপকারী হত না। কিন্তু স্প্ল্যাটের আরেকটি विचিত্র ক্ষমতা আছে। এটি বুদ্ধিমানভাবে অবজেক্টগুলাকে অ্যারেতে কোয়ার্স করতে পারে।

# সাধারণত `*thing` `thing`-কে অ্যারেতে র‍্যাপ করে
x = *"hi mom" # => ["hi mom"]

# ...যদি না এটি nil হয়
x = *nil # => []

# অ্যারে অপরিবর্তিত পাস হয়
x = *[1,2,3] # => [1, 2, 3]

# কিন্তু হ্যাশ অ্যারেতে কনভার্ট হয়
x = *{a: 1} # => [[:a, 1]]

এটি আমাদের একটি টুল দেয় অ্যারে তৈরির জন্য ব Gaulle ম্যানুয়াল টাইপ কোয়ার্সন ছাড়া।

উদাহরণস্বরূপ, কল্পনা করুন আপনি কোনো কনফিগারেশন সিস্টেমের জন্য স্ট্রিংয়ের একটি অ্যারে কালেক্ট করছেন। সাধারণত আপনি চাইবেন:

  • চেক করুন অ্যারে আছে কিনা, না থাকলে ইনিশিয়ালাইজ করুন
  • বুদ্ধিমানভাবে রেসপন্ড করুন যদি কেউ একটি স্ট্রিংয়ের অ্যারে যোগ করতে চায়, শুধু একটা স্ট্রিং না

স্প্ল্যাট অপারেটর আমাদের এটি ফ্রি-এ দেয়:

# আপনার কনফিগারেশন হ্যাশে :ignore অ্যারে থাকতে পারে বা নাও থাকতে পারে
config = { }

# কলব্যাক ফাংশন একটি অ্যারে রিটার্ন করতে পারে
# অথবা একটি সিঙ্গল আইটেম রিটার্ন করতে পারে
def add_ignores
  "scoundrels" # অ্যারেও হতে পারে ["scoundrels", "cads", "ne'er-do-wells"]
end

// এখানেই জাদু ঘটে। আপনি যেকোনো জিনিস দিয়ে শুরু করুন,
// আপনি একটি অ্যারে পাবেন ignore করার জিনিসগুলোর।
config[:ignore] = [*config[:ignore], *add_ignores()]

শেষ

আশা করি স্পষ্ট যে আপনি খুব πιθανে আপনার সব বিদ্যমান অ্যারে-ম্যানিপুলেশন কোড রিরাইট করে স্প্ল্যাট ব্যবহার করবেন না। সেগুলো সবসময় সঠিক টুল নয়, এবং বарবার ব্যবহার করলে কোড পড়তে কঠিন হয়।

তবে, কখনও কখনও একটি অ্যারে স্প্ল্যাট ট্রিক আপনার যা দরকার। আশা করি, যখন সেটি আসবে, আপনি একটা ট্রাই করবেন। :)

  1. GCE, Cloud Storage, এবং Pub/Sub ব্যবহার করে Ruby-তে একটি विश्वস্ত আপটাইম মনিটরিং সিস্টেম বিল্ড করুন

  2. রুবিতে ল্যাম্বডা মাস্টার করুন: বেসিক থেকে অ্যাডভান্সড টেকনিক

  3. রুবি অন রেলসে structure.sql বেছে নেওয়া: সুবিধা, অসুবিধা এবং স্যুইচ করার পদ্ধতি

  4. Kafka দিয়ে রুবি অ্যাপস উন্নত করা: একটি প্রমাণিত Sidekiq সাকসেস স্টোরি