(আনারারি) * অপারেটর এই রুবি কোডটিতে কী করে?


174

রুবি কোড দিয়েছেন

line = "first_name=mickey;last_name=mouse;country=usa" 
record = Hash[*line.split(/=|;/)] 

*অপারেটর বাদে দ্বিতীয় লাইনের সবকিছুই আমি বুঝতে পারি - এটি কী করছে এবং এর জন্য ডকুমেন্টেশনটি কোথায়? (আপনি যেমন অনুমান করতে পারেন, এই মামলার সন্ধান করা কঠিন প্রমাণিত হচ্ছে ...)

উত্তর:


271

*হয় splat অপারেটর।

এটি Arrayআর্গুমেন্টের তালিকায় একটি প্রসারিত করে , এক্ষেত্রে Hash.[]পদ্ধতিতে যুক্তিগুলির তালিকা । (আরও সুনির্দিষ্টভাবে বলতে গেলে, এটি যে কোনও অবজেক্টকে to_ary/ to_aবা to_aরুবি ১.৯-এ সাড়া দেয় তা প্রসারিত করে )

উদাহরণস্বরূপ, নিম্নলিখিত দুটি বিবৃতি সমান:

method arg1, arg2, arg3
method *[arg1, arg2, arg3]

এটি একটি পৃথক প্রসঙ্গে ব্যবহার করা যেতে পারে, কোনও পদ্ধতি সংজ্ঞাতে বাকী সমস্ত পদ্ধতি আর্গুমেন্টগুলি ধরতে। সেক্ষেত্রে এটি প্রসারিত হয় না, তবে একত্রিত হয়:

def method2(*args)  # args will hold Array of all arguments
end

আরও কিছু বিস্তারিত তথ্য এখানে


36
সাধারণভাবে, যখন এলএইচএস-এর মতো পরিস্থিতিতে ব্যবহার করা হয় (যে কোনও সময় আপনি এটি কোনও মূল্যের উপরে প্রার্থনা করছেন), স্প্ল্যাট একটি অ্যারেরকে পৃথক মানগুলিতে বিভক্ত করে এবং আরএইচএস-এর মতো পরিস্থিতিতে ব্যবহার করা হয় (যে কোনও সময় আপনি এটি ব্যবহার করছেন) কিছু পূর্ব নির্ধারিত ভেরিয়েবলের উপরে), এটি পৃথক মানগুলিকে একটি অ্যারেতে পৃথক করে। সুতরাং a,b,*c = d,e,f,*ga = d, b = e, এবং c = [f, g0, g1, g2, ..., gn] সেট করে, যেখানে g = [g0, g1, g2, ..., gn]
রায়পুন

2
কেবলমাত্র সম্পূর্ণতার জন্য, স্প্ল্যাট অপারেটর ডেভিড এ ব্ল্যাক
ডেভিড বুড়ো

12
@ আরম্পিয়ান: বিস্ময়কর মন্তব্য, আপনি সবে এলএইচএস এবং আরএইচএস মিশ্রিত করেছেন। এটি অন্য রাস্তা।
থমাস

46

স্প্ল্যাট অপারেটর একটি ফাংশনে পাস করা একটি অ্যারে আনপ্যাক করে যাতে প্রতিটি উপাদানকে পৃথক প্যারামিটার হিসাবে ফাংশনে প্রেরণ করা হয়।

একটি সহজ উদাহরণ:

>> def func(a, b, c)
>>   puts a, b, c
>> end
=> nil

>> func(1, 2, 3)  #we can call func with three parameters
1
2
3
=> nil

>> list = [1, 2, 3]
=> [1, 2, 3]

>> func(list) #We CAN'T call func with an array, even though it has three objects
ArgumentError: wrong number of arguments (1 for 3)
    from (irb):12:in 'func'
    from (irb):12

>> func(*list) #But we CAN call func with an unpacked array.
1
2
3
=> nil

এটাই!


6

সবাই যেমন উল্লেখ করেছে, এটি একটি "স্প্ল্যাট"। রুবি সিনট্যাক্স সন্ধান করা অসম্ভব এবং আমি অন্যান্য প্রশ্নে এটি জিজ্ঞাসা করেছি। প্রশ্নের সেই অংশটির উত্তর হ'ল আপনি অনুসন্ধান করছেন

asterisk in ruby syntax

গুগলে গুগল আপনার জন্য রয়েছে, আপনি যা দেখছেন তা কথায় যুক্ত করুন।

যাইহোক, অনেক রুবি কোডের মতো, কোডটি বেশ ঘন। দ্য

line.split(/=|;/)

SIX উপাদানগুলির একটি অ্যারে তৈরি করে first_name, mickey, last_name, mouse, country, usa। তারপরে স্প্ল্যাটটিকে হ্যাশে পরিণত করতে ব্যবহৃত হয়। এখন রুবি লোকেরা আপনাকে সর্বদা স্প্ল্যাট পদ্ধতিটি দেখতে পাঠায়, যেহেতু রুবির মধ্যে সমস্ত কিছুই উন্মুক্ত। এটি কোথায় আছে তা সম্পর্কে আমার কোনও ধারণা নেই তবে আপনি একবার এটি পেয়ে গেলে আপনি দেখতে পাবেন যে এটি forঅ্যারের মাধ্যমে একটি চালায় এবং হ্যাশ তৈরি করে।

আপনি মূল ডকুমেন্টেশনে কোডটি সন্ধান করবেন । যদি আপনি এটি খুঁজে না পান (আমি পারিনি), আপনি এই জাতীয় কিছু কোড লেখার চেষ্টা করবেন (যা কাজ করে তবে রুবির মতো কোড নয়):

line = "first_name=mickey;last_name=mouse;country=usa"
presplat = line.split(/=|;/)
splat = Hash.new
for i in (0..presplat.length-1)
    splat[presplat[i]] = presplat[i+1] if i%2==0
end

puts splat["first_name"]

এবং তারপরে রুবি গ্যাং আপনাকে বলতে সক্ষম হবে যে আপনার কোডটি কেন বোকা, খারাপ, বা কেবল সাধারণ ভুল।

আপনি যদি এ পর্যন্ত পড়ে থাকেন তবে শুরু করার জন্য হ্যাশ ডকুমেন্টেশনের মাধ্যমে একটি পঠন করুন ।

মূলত একটি হ্যাশ যা বেশ কয়েকটি আর্গুমেন্টের সাহায্যে আরম্ভ করা হয় সেগুলি তাদের মূল মান জোড়া হিসাবে তৈরি করে:

Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}

সুতরাং আপনার উদাহরণে এটি নিম্নলিখিত হ্যাশ দিকে পরিচালিত করবে:

{"first_name"=>"mickey", "last_name"=>"mouse", "county"=>"usa"}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.