2010-10-18 31 views
16

tôi đã viết một ứng dụng nhỏ nhanh chóng lấy tệp cơ sở của mã với một số từ khóa, tệp thay thế cho từ khóa và xuất tệp mới với từ khóa được thay thế.Ruby 1.9 Array.to_s hoạt động khác nhau?

Khi tôi đang sử dụng Ruby 1.8, kết quả đầu ra của tôi sẽ ổn. Bây giờ khi sử dụng Ruby 1.9, mã thay thế của tôi có các ký tự dòng mới trong đó thay vì các dòng cấp dữ liệu.

Ví dụ, tôi thấy cái gì đó như:

["\r\nDim RunningNormal_1 As Boolean", "\r\nDim RunningNormal_2 As Boolean", "\r\nDim RunningNormal_3 As Boolean"] 

thay vì:

Dim RunningNormal_1 As Boolean 
Dim RunningNormal_2 As Boolean 
Dim RunningNormal_3 As Boolean 

tôi sử dụng một hash của thay thế { "KEYWORD" => [ "1", "2", "3"]} và một mảng các dòng được thay thế.

tôi sử dụng khối này để hoàn tất việc thay thế:

resultingLibs.each do |x| 
    libraryString.sub!(/(<REPEAT>(.*?)<\/REPEAT>)/im) do |match| 
    x.each do |individual| 
     individual.to_s 
    end 
    end 
end 
#for each resulting group of the repeatable pattern, 
# 
#Write out the resulting libs to a combined string 

linh cảm của tôi là tôi in ra các mảng thay vì chuỗi trong mảng. Mọi đề xuất về bản sửa lỗi. Khi tôi gỡ lỗi và in chuỗi thay thế của tôi bằng cách sử dụng đặt, đầu ra có vẻ chính xác. Khi tôi sử dụng phương pháp to_s (đó là cách ứng dụng của tôi ghi đầu ra vào tệp đầu ra), đầu ra của tôi có vẻ sai.

Sửa lỗi sẽ tốt đẹp, nhưng điều tôi thực sự muốn biết là những gì đã thay đổi giữa Ruby 1.8 và 1.9 gây ra hành vi này. Phương pháp to_s có thay đổi bằng cách nào đó trong Ruby 1.9 không?

* tôi thiếu kinh nghiệm trong Ruby

+0

mẫu mã sẽ được tốt đẹp – orip

+0

tôi thêm mã nguồn mà tôi hy vọng là có liên quan. – jrsconfitto

+0

+1. Tôi đã sử dụng Ruby 1.8 và 1.9 một chút công bằng, nhưng không bao giờ biết về sự khác biệt này! –

Trả lời

29

Vâng, bạn đang gọi điện thoại to_s trên một mảng các chuỗi. Trong 1,8 tương đương với việc gọi join, trong 1,9 nó tương đương với việc gọi inspect.

Để nhận được hành vi bạn muốn trong cả 1.8 và 1.9, hãy gọi join thay vì to_s.

+0

Khi nào 'kiểm tra' hữu ích? – chongman

+0

@chongman Bạn có nghĩa là cho mảng trên 'to_s'? Nó sẽ hữu ích trong trường hợp thứ bạn đang cố gắng kiểm tra sẽ không phải là một mảng. Sử dụng 'p' /' inspect' để kiểm tra mảng chỉ rõ ràng hơn và nhất quán hơn vì đó là những gì bạn sử dụng để kiểm tra các giá trị khác. – sepp2k

+0

Cảm ơn. Tôi nhận ra sự nhầm lẫn của tôi là một vấn đề 1.8.6 (?) Vs 1.9. Một hướng dẫn cho thấy "Cat In Hat" .to_a 'và sau đó tôi giả định' to_s 'nên trả về chuỗi gốc, mà tôi tin rằng nó có trong 1.8.6. Trong 1,9, to_a được loại bỏ như một phương thức cho chuỗi. 'split ("")' và 'join' là các inverses. – chongman

3

Xin xem here, dưới Array

Array#to_s is equivalent to Array#inspect 

[1,2,3,4].to_s         # => "[1, 2, 3, 4]" 

instead of 

RUBY_VERSION          # => "1.8.5" 
[1,2,3,4].to_s         # => "1234" 
Các vấn đề liên quan