একটি ডাবল * (স্প্ল্যাট) অপারেটর কী করে


214

আপনি কি এইভাবে ঘোষিত কোনও ফাংশন দেখেছেন?

def foo a, **b
  ...
end

আমি বুঝতে পারি যে একটি একক *স্প্ল্যাট অপারেটর। কী **মানে?

উত্তর:


373

রুবি ২.০ কীওয়ার্ড আর্গুমেন্টগুলি প্রবর্তন করে, এবং কীওয়ার্ড আর্গুমেন্টের **মতো কাজ *করে। এটি কী / মান জোড়া দিয়ে একটি হ্যাশ প্রদান করে।

এই কোডের জন্য:

def foo(a, *b, **c)
  [a, b, c]
end

এখানে একটি ডেমো রয়েছে:

> foo 10
=> [10, [], {}]
> foo 10, 20, 30
=> [10, [20, 30], {}]
> foo 10, 20, 30, d: 40, e: 50
=> [10, [20, 30], {:d=>40, :e=>50}]
> foo 10, d: 40, e: 50
=> [10, [], {:d=>40, :e=>50}]

44
এটি প্রশ্নের পুরোপুরি উত্তর দেয়, তবে আমার একটি সামান্য সংযোজন ছিল। আপনার পাস হওয়া অ্যারেতে যেমন স্প্ল্যাট অপারেটর ব্যবহার করা যেতে পারে, তেমনি হ্যাশগুলিতেও ডাবল স্প্ল্যাট ব্যবহার করা যেতে পারে। যদি opts = {d: 40, e: 50}, তারপর foo 10, opts, f: 60নির্ধারিত {f: 60}হবে c, যেখানে foo 10, **opts, f: 60বরাদ্দ হবে {d: 40, e: 50, f: 60}। দ্বিতীয় প্রভাব অর্জন করতে, পূর্বে আপনি mergeস্পষ্টভাবে অ্যারেগুলি ডি করতেন ।
brymck

আমি ধরে নেব যে এটি কোনও পদ্ধতির জন্য
alচ্ছিক

সম্ভবত একটি নোট মূল্যবান যে কীওয়ার্ড-স্প্ল্যাটের সাথে কী-ওয়ার্ড-আর্গুমেন্টগুলি মিশ্রিত করা হলে, কীওয়ার্ড স্প্লটটি কীওয়ার্ড আর্গুমেন্টগুলির পরে আসা দরকার।
মিঃমিসিজ

43

এটি ডাবল স্প্ল্যাট অপারেটর যা রুবি ২.০ থেকে পাওয়া যায়।

এটি সমস্ত কীওয়ার্ড আর্গুমেন্টগুলি ক্যাপচার করে (এটি একটি সাধারণ হ্যাশও হতে পারে, যা রুবি ভাষার অংশ হওয়ার আগে কীওয়ার্ড আর্গুমেন্টগুলি অনুকরণ করার মূio় উপায় ছিল)

def my_method(**options)
  puts options.inspect
end

my_method(key: "value")

উপরের কোডটি {key:value}কনসোলে প্রিন্ট করে।

যেমন একক স্প্ল্যাট অপারেটর সমস্ত নিয়মিত আর্গুমেন্টগুলি ক্যাপচার করে তবে অ্যারের পরিবর্তে আপনি একটি হ্যাশ পান

বাস্তব জীবনের উদাহরণ:

উদাহরণস্বরূপ রেলগুলিতে cycleপদ্ধতিটি দেখতে এরকম দেখাচ্ছে:

def cycle(first_value, *values)
  options = values.extract_options!
  # ...
end

এই পদ্ধতি ভালো বলা যেতে পারে: cycle("red", "green", "blue", name: "colors")

এটি বেশ সাধারণ প্যাটার্ন: আপনি আর্গুমেন্টের একটি তালিকা গ্রহণ করেন এবং শেষটি হ'ল একটি বিকল্প হ্যাশ যা এক্সট্রাক্ট করা যায় - উদাহরণস্বরূপ - অ্যাক্টিভসপোর্ট ব্যবহার করে extract_options!

রুবি ২.০ এ আপনি এই পদ্ধতিগুলি সহজ করতে পারেন:

def cycle(first_value, *values, **options)
  # Same code as above without further changes!
end

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


20

এছাড়াও, আপনি এটি কলার পক্ষে এটি ব্যবহার করতে পারেন:

def foo(opts); p opts end
bar = {a:1, b:2}

foo(bar, c: 3)
=> ArgumentError: wrong number of arguments (given 2, expected 1)

foo(**bar, c: 3)
=> {:a=>1, :b=>2, :c=>3}

5
বাহ, ডাবল স্প্ল্যাট ES6 এর অবজেক্ট স্প্রেড অপারেটরের পক্ষে অ্যানালগাস।
এমপাইসট

1
ধন্যবাদ, এটিই আমি নিশ্চিত করছি।
কোর্টেক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.