রুবি: একটি স্ট্রিংয়ে ভেরিয়েবলগুলি মার্জ করা হচ্ছে


97

আমি রুবিতে ভেরিয়েবলগুলিকে স্ট্রিংয়ে একীভূত করার আরও ভাল উপায় খুঁজছি।

উদাহরণস্বরূপ যদি স্ট্রিংটি এমন কিছু হয়:

" "animal actionsecond_animal

এবং আমার জন্য ভেরিয়েবল আছে animal, actionএবং second_animal, স্ট্রিংগুলিতে সেই ভেরিয়েবলগুলি রাখার পছন্দের উপায় কী?

উত্তর:


248

মূর্খতাপূর্ণ উপায় হল এরকম কিছু লিখতে:

"The #{animal} #{action} the #{second_animal}"

স্ট্রিংটির চারপাশে ডাবল উদ্ধৃতি (") নোট করুন: এটি রুবির অন্তর্নির্মিত স্থানধারক প্রতিস্থাপনটি ব্যবহারের জন্য এটি ট্রিগার You আপনি তাদের একক উদ্ধৃতি (') দিয়ে প্রতিস্থাপন করতে পারবেন না বা স্ট্রিংটি যেমন থাকবে তেমন রাখা হবে।


4
দুঃখিত, সমস্যাটি আমি খুব বেশি সরল করে দিয়েছি। স্ট্রিংটি একটি ডাটাবেস থেকে টানা হবে এবং পরিবর্তনশীল বিভিন্ন কারণের উপর নির্ভরশীল। সাধারণত আমি 1 বা দুটি ভেরিয়েবলের জন্য একটি প্রতিস্থাপন ব্যবহার করব তবে এটি আরও বেশি হওয়ার সম্ভাবনা রয়েছে। কোন চিন্তা?
ফয়ারমিডিয়োক্রিটি

# {} নির্মাণটি সম্ভবত দ্রুততম (যদিও এটি এখনও আমার কাছে বিপরীত বলে মনে হচ্ছে)। জিক্সের পরামর্শ হিসাবে, আপনি + বা << দিয়ে স্ট্রিংগুলিও একত্র করতে পারেন তবে কিছু মধ্যবর্তী স্ট্রিং তৈরি হতে পারে যা ব্যয়বহুল।
মাইক উডহাউস

ভেরিয়েবলগুলি
বিভক্ত

118

স্ট্রিংয়ে মানগুলি ইনজেক্ট করতে আপনি স্প্রিন্টফ-এর মতো বিন্যাস ব্যবহার করতে পারেন। তার জন্য স্ট্রিংটিতে অবশ্যই স্থানধারক অন্তর্ভুক্ত থাকতে হবে। আপনার যুক্তিগুলিকে একটি অ্যারেতে রাখুন এবং এই উপায়গুলি ব্যবহার করুন: (আরও তথ্যের জন্য কার্নেল :: স্প্রিন্টফের জন্য ডকুমেন্টেশনটি দেখুন )

fmt = 'The %s %s the %s'
res = fmt % [animal, action, other_animal]  # using %-operator
res = sprintf(fmt, animal, action, other_animal)  # call Kernel.sprintf

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

'The %3$s %2$s the %1$s' % ['cat', 'eats', 'mouse']

অথবা হ্যাশ কীগুলি ব্যবহার করে যুক্তিটি নির্দিষ্ট করুন:

'The %{animal} %{action} the %{second_animal}' %
  { :animal => 'cat', :action=> 'eats', :second_animal => 'mouse'}

নোট করুন যে আপনাকে অবশ্যই %অপারেটরের কাছে সমস্ত যুক্তির জন্য একটি মান সরবরাহ করতে হবে । উদাহরণস্বরূপ, আপনি সংজ্ঞা এড়াতে পারবেন না animal


18

আমি #{}অন্য উত্তরগুলি দ্বারা বর্ণিত হিসাবে কনস্ট্রাক্টরটি ব্যবহার করব । আমি এখানে উল্লেখ করতে চাই এখানে সত্যিকারের সূক্ষ্মতা আছে এখানে দেখার জন্য:

2.0.0p247 :001 > first_name = 'jim'
 => "jim" 
2.0.0p247 :002 > second_name = 'bob'
 => "bob" 
2.0.0p247 :003 > full_name = '#{first_name} #{second_name}'
 => "\#{first_name} \#{second_name}" # not what we expected, expected "jim bob"
2.0.0p247 :004 > full_name = "#{first_name} #{second_name}"
 => "jim bob" #correct, what we expected

স্ট্রিংগুলি একক উদ্ধৃতি দিয়ে তৈরি করা যেতে পারে (যেমন first_nameএবং last_nameভেরিয়েবল দ্বারা প্রদর্শিত হয় , তবে #{}কনস্ট্রাক্টর কেবল ডাবল উদ্ধৃতি সহ স্ট্রিংগুলিতে ব্যবহার করতে পারেন।



11

একে স্ট্রিং ইন্টারপোলেশন বলা হয় এবং আপনি এটি এর মতো করেন:

"The #{animal} #{action} the #{second_animal}"

গুরুত্বপূর্ণ: স্ট্রিং যখন ডাবল কোট ("") এর মধ্যে থাকে কেবল তখনই এটি কাজ করবে।

কোডের উদাহরণ যা আপনার প্রত্যাশার মতো কাজ করবে না:

'The #{animal} #{action} the #{second_animal}'

সঠিক শব্দটি ব্যবহারের জন্য আপনাকে ধন্যবাদ যাতে নতুন প্রোগ্রামাররা শিখতে পারে: দোলন।
মাইক

3

মানক ERB টেম্প্লেটিং সিস্টেমটি আপনার দৃশ্যের জন্য কাজ করতে পারে।

def merge_into_string(animal, second_animal, action)
  template = 'The <%=animal%> <%=action%> the <%=second_animal%>'
  ERB.new(template).result(binding)
end

merge_into_string('tiger', 'deer', 'eats')
=> "The tiger eats the deer"

merge_into_string('bird', 'worm', 'finds')
=> "The bird finds the worm"

0

আপনি এটির স্থানীয় ভেরিয়েবলগুলির সাথে এটি ব্যবহার করতে পারেন:

@animal = "Dog"
@action = "licks"
@second_animal = "Bird"

"The #{@animal} #{@action} the #{@second_animal}"

আউটপুট হবে: " কুকুর licks বার্ড "

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