Trong Ruby, làm cách nào để tạo một chuỗi dài văn bản lặp lại?


138

Cách tốt nhất để tạo ra một chuỗi dài nhanh chóng trong ruby ​​là gì? Điều này hoạt động, nhưng rất chậm:

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

Tôi cũng nhận thấy rằng việc tạo một chuỗi có độ dài vừa phải và sau đó nối thêm chuỗi đó vào một chuỗi có độ dài mong muốn sẽ hoạt động nhanh hơn nhiều:

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

Bất cứ một đề nghị nào khác?


1
Cách tốt nhất là sử dụng JRuby và sử dụng StringBuffer. Ôi trời ơi.
Jonathan Feinberg

Câu trả lời:


307
str = "0" * 999999

22
Thật vậy, rất kỳ lạ, hãy nhìn cách khác biệt và thanh lịch trong Python : str = "0" * 999999;)
tokland

1
Tại sao thứ tự quan trọng với Ruby? Khi tôi làm 99999 * "0"tôi nhận đượcTypeError: String can't be coerced into Fixnum
Steven

16
@Steven Từ quan điểm của Ruby, "0" * 999999được coi là "0".*(999999)nơi *là một phương pháp trong Stringlớp. Phương thức đó chấp nhận các số làm đối số hợp lệ để thực hiện sao chép chuỗi. Khi bạn đảo ngược biểu thức, chúng tôi nhận được 999999.*("0"). Bây giờ chúng ta đang nói về *phương thức trong FixNumlớp và phương thức đó từ chối lấy các chuỗi làm đối số. Nó chắc chắn có thể (ví dụ, tự động nỗ lực hết sức để chuyển đổi đối số thành FixNum) nhưng các nhà thiết kế ngôn ngữ đã quyết định chống lại việc truyền cảm hứng Perlish của Ruby quá đầy đủ.
FMc

11

Một lựa chọn tương đối nhanh khác là

str = '%0999999d' % 0

Mặc dù điểm chuẩn

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

Cho thấy phép nhân vẫn nhanh hơn

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

Tôi thích câu trả lời này, nhưng dường như tôi không thể làm cho nó hoạt động cho bất cứ điều gì khác ngoài '0'. Tôi phải làm gì nếu tôi muốn 100 r?
triển

2
Nó sẽ không hoạt động với các biểu tượng khác vì nó tận dụng phần đệm số trong các chuỗi định dạng. Các số có thể được đệm bằng 0 ở phía trước hoặc phía sau (đối với số thập phân) mà không thay đổi giá trị, r không hoạt động như vậy.
Andrew
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.