2010-06-29 37 views
5

Câu hỏi này là về định dạng chuỗi của ruby.Phiên bản Ruby của phương thức String

Trong Python, các cấu trúc dữ liệu tích hợp có phương thức chuỗi được tích hợp sẵn và do đó khi biến được in, chuỗi được định dạng thuận tiện để phản ánh cấu trúc dữ liệu được sử dụng. Ví dụ:

>>>$ python 
Python 2.6.4 (r264:75706, Dec 7 2009, 18:45:15) 
[GCC 4.4.1] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
$>>> a = [1,2,3,4] 
$>>> str(a) 
'[1, 2, 3, 4]' 
$>>> print a 
[1, 2, 3, 4] 
$>>> d = { "a":"a", "b":"b", 1:5 } 
$>>> str(d) 
"{'a': 'a', 1: 5, 'b': 'b'}" 
$>>> print d 
{'a': 'a', 1: 5, 'b': 'b'} 
$>>> x = [1, 23, 4] 
$>>> print x 
[1, 23, 4] 

thông báo rằng khi tôi in một, giá trị là [1, 2, 3, 4]

Tuy nhiên, trong ruby, khi tôi cố gắng làm những điều tương tự, tôi nhận được kết quả này:

>>>$ irb 
irb(main):001:0> x = [1,23,4] 
=> [1, 23, 4] 
irb(main):002:0> x.to_s 
=> "1234" 
irb(main):003:0> puts x 
1 
23 
4 
=> nil 
irb(main):004:0> print x 
1234=> nil 
irb(main):005:0> h = { "a" => "a", 1 => 5, 'b'=>'b' } 
=> {"a"=>"a", "b"=>"b", 1=>5} 
irb(main):006:0> print h 
aabb15=> nil 
irb(main):007:0> h.to_s 
=> "aabb15" 
irb(main):008:0> puts h 
aabb15 
=> nil 
irb(main):009:0> 

Như bạn thấy, không có định dạng nào với phương thức to_s. Hơn nữa, có một vấn đề duy nhất nếu tôi gọi to_s trên [1,2,3,4] và [1,23,4] và [1234] vì to_s gộp tất cả các phần tử lại với nhau để tất cả chúng kết thúc là "1234". Tôi biết rằng tôi có thể cố gắng mô phỏng các phương thức chuỗi được xây dựng sẵn của python cho mọi cấu trúc dữ liệu gốc bằng cách ghi đè phương thức to_s ("[" + a.join (",") + "]" #just cho mảng), nhưng tôi đã tự hỏi nếu có một lựa chọn tốt hơn kể từ khi hack nó dường như phá vỡ khái niệm quy ước trên cấu hình.

Vì vậy, có tương đương với ruby ​​của phương thức chuỗi được tích hợp sẵn của python?

Trả lời

9
[1,23,4].inspect #=> "[1, 23, 4]" 
p [1,23,4] # Same as puts [1,23,4].inspect 
+0

gotcha, gần hơn với những gì tôi muốn. cảm ơn. Tôi đã đọc qua API Array nhưng không thể tìm thấy vẫn còn tồn tại cho điều này: ------------------------------ ---------------- irb (chính): 002: 0> [1,2,3,4, 'a', "b"] .inspect => "[ 1, 2, 3, 4, \ "a \", \ "b \"] " --------------------------- ------------------------- thật tuyệt khi không nhìn thấy dấu gạch chéo ngược. điều này có thể không? – dzt

+0

in [1,2,3,4, 'a', "b"]. Kiểm tra => [1,2,3,4, 'a', "b"] – Dogbert

+0

cảm ơn Adam. Nhưng chỉ vì tò mò, bạn sẽ giữ lại giá trị của chuỗi được định dạng độc đáo như thế nào? khi bạn gọi là in, giá trị trả về là số không, không phải là chuỗi được định dạng. – dzt

0

Sử dụng kiểm tra

irb(main):001:0> h = { "a" => "a", 1 => 5, 'b'=>'b' } 
=> {"a"=>"a", "b"=>"b", 1=>5} 
irb(main):003:0> puts h.inspect 
{"a"=>"a", "b"=>"b", 1=>5} 
=> nil 
irb(main):004:0> 
+0

cảm ơn. Nhưng là có một get-around cho này :::: [1,2,3,4, 'a', "b "] .inspect =>" [1, 2, 3, 4, \ "a \", \ "b \"] "------- như trong nó có thể không nhìn thấy dấu gạch chéo ngược? – dzt

+0

Có. Như tôi thấy trong ví dụ của tôi, (trong IRB), sử dụng đặt h.inspect, chứ không phải h.inspect –

9

Trong Ruby, có bốn phương pháp mà thường có sẵn để có được một chuỗi đại diện của một đối tượng.

  1. #to_str: đây là một phần của giao thức Ruby tiêu chuẩn loại chuyển đổi (tương tự như to_int, to_ary, to_float, & hellip;). Nó được sử dụng nếu và chỉ nếu đối tượng thực sự thực sự là một chuỗi nhưng vì bất kỳ lý do nào không phải là trường hợp của lớp String. Nó là vô cùng bất thường. Trong thực tế, trong toàn bộ thư viện cốt lõi, chỉ có thực hiện no-op trong chính lớp String.
  2. #to_s: đây cũng là một phần của giao thức chuyển đổi loại tiêu chuẩn của Ruby (tương tự như to_i, to_a, to_f, & hellip;). Nó được sử dụng nếu đối tượng có một số loại biểu diễn chuỗi hợp lý. Nó thực sự không cần phải một chuỗi. Hầu như tất cả các đối tượng nên phản ứng với điều này.
  3. Kernel#String(obj): đây cũng là một phần của giao thức chuyển đổi loại tiêu chuẩn của Ruby (tương tự như Kernel#Integer(obj), Kernel#Array(obj), Kernel#Float(obj), & hellip;). Nó giống như obj.to_s.
  4. #inspect: nó được cho là trả lại mô tả có thể đọc được của con người về đối tượng cho mục đích gỡ lỗi. Nói cách khác: nó là để kiểm tra một đối tượng (duh).

Có ba phương pháp cho các đối tượng in ấn:

  1. Kernel#print(obj, ...): in tất cả obj s phân cách bằng $, và chấm dứt bởi $\.Nếu số điện thoại obj không phải là String, print trước tiên sẽ gọi số obj.to_s.
  2. Kernel#puts(obj, ...): về cơ bản tương đương với $stdout.puts(obj, ...). Nó cũng in các obj s, nhưng nó thường tách chúng với các dòng mới. Tuy nhiên, nó cũng có một số trường hợp đặc biệt, đặc biệt nó xử lý các mảng đặc biệt bằng cách in từng mục trên một dòng mới.
  3. Kernel#p(obj, ...): tương tự như puts nhưng gọi #inspect trên tất cả obj s.

Ngoài những thư viện này, còn có thư viện pp (in đẹp) trong thư viện chuẩn, thêm phương thức Kernel#pp(obj, ...).

Sau đó, có thư viện awesome_printhirb.

+0

Cảm ơn, điều này giúp làm sáng tỏ rất nhiều Cảm ơn bạn đã giới thiệu Hirb, công việc này rất tuyệt vời khi xem các mô hình bản ghi hoạt động của Rails. – dzt

Các vấn đề liên quan