রুবিতে আমি কীভাবে পুনরাবৃত্তি পাঠ্যের দীর্ঘ স্ট্রিং তৈরি করতে পারি?


138

রুবিতে দ্রুত একটি দীর্ঘ স্ট্রিং উত্পন্ন করার সর্বোত্তম উপায় কী? এটি কাজ করে তবে খুব ধীর:

str = ""
length = 100000
(1..length).each {|i| str += "0"}

আমি আরও লক্ষ্য করেছি যে একটি শালীন দৈর্ঘ্যের একটি স্ট্রিং তৈরি করা এবং তারপরে একটি পছন্দসই দৈর্ঘ্য পর্যন্ত বিদ্যমান স্ট্রিংয়ের সাথে যুক্ত করা আরও দ্রুত কাজ করে:

str = ""
incrementor = ""
length = 100000
(1..1000).each {|i| incrementor += "0"}
(1..100).each {|i| str += incrementor}

অন্য কোন পরামর্শ?


1
সবচেয়ে ভাল উপায় হ'ল জেআরবি ব্যবহার করা এবং স্ট্রিংবুফার ব্যবহার করা। ওহহহ।
জনাথন ফিনবার্গ

উত্তর:


307
str = "0" * 999999

22
str = "0" * 999999
সত্যই

1
আদেশ কেন রুবির সাথে গুরুত্বপূর্ণ? যখন আমি 99999 * "0"পাইTypeError: String can't be coerced into Fixnum
স্টিভেন

16
রুবির দৃষ্টিভঙ্গি থেকে স্টিভেন @ ক্লাসে যেখানে পদ্ধতি আছে "0" * 999999তেমন আচরণ করা হয় । এই পদ্ধতিটি স্ট্রিংয়ের প্রতিলিপি সম্পাদনের জন্য সংখ্যাটিকে বৈধ আর্গুমেন্ট হিসাবে গ্রহণ করে। আপনি যখন মত প্রকাশের বিপরীত হন, আমরা পাই । এখন আমরা ক্লাসে পদ্ধতি সম্পর্কে কথা বলছি , এবং সেই পদ্ধতিটি স্ট্রিংগুলিকে আর্গুমেন্ট হিসাবে গ্রহণ করতে অস্বীকার করেছিল। এটি অবশ্যই (উদাহরণস্বরূপ, যুক্তিটিকে একটি ফিক্সনামে রূপান্তরিত করার জন্য স্বয়ংক্রিয়ভাবে সেরা প্রচেষ্টা চালিয়ে যেতে পারে) তবে ভাষা ডিজাইনাররা রুবির পার্লিশ অনুপ্রেরণাগুলি খুব সম্পূর্ণরূপে গ্রহণ করার বিরুদ্ধে সিদ্ধান্ত নিয়েছিল। "0".*(999999)*String999999.*("0")*FixNum
এফএমসি

11

আরেকটি তুলনামূলক দ্রুত বিকল্প হ'ল

str = '%0999999d' % 0

যদিও বেঞ্চমার্কিং

require 'benchmark'
Benchmark.bm(9)  do |x|
  x.report('format  :') { '%099999999d' % 0 }
  x.report('multiply:') { '0' * 99999999 }
end

দেখায় যে গুণটি এখনও আরও দ্রুত

               user     system      total        real
format  :  0.300000   0.080000   0.380000 (  0.405345)
multiply:  0.080000   0.080000   0.160000 (  0.172504)

আমি এই উত্তরটি পছন্দ করি তবে এটি '0' ব্যতীত অন্য কোনও কিছুর জন্য কাজ করতে পারে বলে মনে হয় না। আমি 100 আর চাইলে আমি কী করব?
উন্নতপত্রে

2
এটি অন্যান্য চিহ্নগুলির সাথে কাজ করবে না কারণ এটি ফর্ম্যাট স্ট্রিংগুলিতে নম্বর প্যাডিংয়ের সুবিধা নিচ্ছে। নম্বরগুলি পরিবর্তন না করে 0 এর সামনে বা পিছনে (দশমিকের জন্য) প্যাড করা যেতে পারে, r এর মতো কাজ করবেন না।
অ্যান্ড্রু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.