উত্তর:
রুবি ২.০ কীওয়ার্ড আর্গুমেন্টগুলি প্রবর্তন করে, এবং কীওয়ার্ড আর্গুমেন্টের **
মতো কাজ *
করে। এটি কী / মান জোড়া দিয়ে একটি হ্যাশ প্রদান করে।
এই কোডের জন্য:
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}]
এটি ডাবল স্প্ল্যাট অপারেটর যা রুবি ২.০ থেকে পাওয়া যায়।
এটি সমস্ত কীওয়ার্ড আর্গুমেন্টগুলি ক্যাপচার করে (এটি একটি সাধারণ হ্যাশও হতে পারে, যা রুবি ভাষার অংশ হওয়ার আগে কীওয়ার্ড আর্গুমেন্টগুলি অনুকরণ করার মূ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
স্বীকারযোগ্যভাবে এটি কেবলমাত্র একটি সামান্য উন্নতি যদি আপনি ইতিমধ্যে অ্যাক্টিভসপোর্ট ব্যবহার করছেন তবে সাধারণ রুবির জন্য কোডটি বেশ সংক্ষিপ্ততা অর্জন করে।
এছাড়াও, আপনি এটি কলার পক্ষে এটি ব্যবহার করতে পারেন:
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}
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
স্পষ্টভাবে অ্যারেগুলি ডি করতেন ।