Cách tốt nhất để in một hàm băm


169

Tôi có một hàm băm lớn với các mảng và băm lồng nhau. Tôi chỉ đơn giản là in nó ra để nó 'dễ đọc' cho người dùng.

Tôi muốn nó giống như to_yaml - điều đó khá dễ đọc - nhưng vẫn quá công nghệ.

Cuối cùng, nó sẽ là người dùng cuối, những người cần đọc các khối dữ liệu này để họ cần được định dạng sạch sẽ.

Bất kỳ đề xuất?



tiện ích trực tuyến jsonviewer.stack.hu . Tuy nhiên, nó không hoạt động đúng cho cú pháp tên lửa băm.
Amit Patel

Câu trả lời:


256
require 'pp'
pp my_hash

Sử dụng ppnếu bạn cần một giải pháp tích hợp và chỉ muốn ngắt dòng hợp lý.

Sử dụng awesome_print nếu bạn có thể cài đặt đá quý. (Tùy thuộc vào người dùng của bạn, bạn có thể muốn sử dụng index:falsetùy chọn để tắt hiển thị các chỉ số mảng.)


pp là tốt, nhưng thật đáng tiếc rằng người ta không thể giới hạn độ sâu.
akim

95

Nếu bạn có JSON, tôi khuyên bạn JSON.pretty_generate(hash)vì nó đơn giản hơn awesome_print , trông tuyệt vời trong prethẻ và cho phép sao chép dễ dàng từ một trang web. (Xem thêm: Làm cách nào tôi có thể "đẹp" định dạng đầu ra JSON của mình trong Ruby on Rails? )


Câu trả lời này sẽ được hưởng lợi từ một ví dụ thực tế
Travis Bear

@TravisBear Có đầu ra ví dụ nếu bạn nhấp vào liên kết "xem thêm" trong câu trả lời của tôi. Tôi đề nghị câu trả lời này cụ thể: stackoverflow.com/a/1823885/109618
David J.

8
Nó sẽ làputs JSON.pretty_generate(hash)
joeloui

Nếu bạn cần tạo JSON, hãy cho phép tôi giới thiệu thư viện (miễn phí, OSS, không quảng cáo) của riêng tôi để tạo JSON đẹp từ Ruby hoặc JS: NeatJSON (Ruby)NeatJSON (Trực tuyến / JS)
Phrogz

Xin lỗi, tôi nhận ra rằng Pretty_generate không chấp nhận một đối tượng Ruby, không phải văn bản json.
Tony

26

Một giải pháp khác phù hợp với tôi hơn pphoặc awesome_print:

require 'pry' # must install the gem... but you ALWAYS want pry installed anyways
Pry::ColorPrinter.pp(obj)

2
Lưu ý rằng Pry::ColorPrinter.pp(obj)ghi vào tiêu chuẩn ra nhưng có thể mất các thông số bổ sung, bao gồm cả đích. Giống nhưPry::ColorPrinter.pp(obj, a_logger)
Eric Urban

Tôi ngạc nhiên vì điều này không được ghi nhận tốt hơn: Tôi luôn sử dụng pry như bảng điều khiển Rails của mình và tôi đã tìm kiếm rất lâu cách chạm vào máy in đẹp mà không cần sử dụng đá quý khác. Nâng cao vì giải pháp này cuối cùng đã chấm dứt tìm kiếm dài của tôi. :-)
wiz

20

Nếu bạn không có bất kỳ hành động đá quý ưa thích nào, nhưng có JSON, dòng CLI này sẽ hoạt động trên hàm băm:

puts JSON.pretty_generate(my_hash).gsub(":", " =>")

#=>
{
  :key1 => "value1",

  :key2 => "value2",

  :key3 => "value3"
}


1
Điều này cũng không đối phó với null (JSON) so với nil (Ruby).
Rennex

1
Vẫn tiện dụng cho hầu hết các tình huống.
Abram

1
Không thể tin điều này ba năm sau! Cảm ơn @ Abram. :) Đây không phải là giải pháp tao nhã nhất trên thế giới nhưng nó hoàn thành công việc một cách khó khăn.
Nick Schwaderer

4

Sử dụng các câu trả lời ở trên nếu bạn đang in cho người dùng.

Nếu bạn chỉ muốn tự in nó trong bảng điều khiển, tôi khuyên bạn nên sử dụng đá quý pry thay vì irb. Bên cạnh việc in ấn đẹp, pry còn có rất nhiều tính năng khác (kiểm tra railscast bên dưới)

cài đặt đá quý

Và kiểm tra railscast này:

http://railscasts.com/episodes/280-pry-with-rails


3

Dễ dàng thực hiện với json nếu bạn tin tưởng các phím của mình được lành mạnh:

JSON.pretty_generate(a: 1, 2 => 3, 3 => nil).
  gsub(": null", ": nil").
  gsub(/(^\s*)"([a-zA-Z][a-zA-Z\d_]*)":/, "\\1\\2:"). # "foo": 1 -> foo: 1
  gsub(/(^\s*)(".*?"):/, "\\1\\2 =>") # "123": 1 -> "123" => 1

{
  a: 1,
  "2" => 3,
  "3" => nil
}

1

Sử dụng Pry, bạn chỉ cần thêm đoạn mã sau vào ~ / .pryrc:

require "awesome_print"
AwesomePrint.pry!

1

Trong tất cả các loại đá quý tôi đã thử, show_datađá quý hoạt động tốt nhất cho tôi, bây giờ tôi sử dụng nó rộng rãi để đăng nhập hàm băm params trong Rails mọi lúc


0

Đối với băm lớn lồng nhau, tập lệnh này có thể hữu ích cho bạn. Nó in một hàm băm lồng nhau trong một cú pháp python / like đẹp chỉ có các vết lõm để dễ sao chép.

module PrettyHash
  # Usage: PrettyHash.call(nested_hash)
  # Prints the nested hash in the easy to look on format
  # Returns the amount of all values in the nested hash

  def self.call(hash, level: 0, indent: 2)
    unique_values_count = 0
    hash.each do |k, v|
      (level * indent).times { print ' ' }
      print "#{k}:"
      if v.is_a?(Hash)
        puts
        unique_values_count += call(v, level: level + 1, indent: indent)
      else
        puts " #{v}"
        unique_values_count += 1
      end
    end
    unique_values_count
  end
end

Ví dụ sử dụng:

  h = {a: { b: { c: :d }, e: :f }, g: :i }
  PrettyHash.call(h)

a:
  b:
    c: d
  e: f
g: i
=> 3

Giá trị được trả về là số (3) của tất cả các giá trị cấp độ cuối của hàm băm lồng nhau.


0

Đây là một cách tiếp cận khác sử dụng json và rouge:

require 'json'
require 'rouge'

formatter = Rouge::Formatters::Terminal256.new
json_lexer = Rouge::Lexers::JSON.new

puts formatter.format(json_lexer.lex(JSON.pretty_generate(JSON.parse(response))))

(phân tích phản hồi từ ví dụ RestClient)


-4

Trong Rails, mảng và băm trong Ruby có các hàm to_json tích hợp. Tôi sẽ sử dụng JSON chỉ vì nó rất dễ đọc trong trình duyệt web, ví dụ Google Chrome.

Điều đó được nói rằng nếu bạn lo lắng về việc nó trông quá "công nghệ", có lẽ bạn nên viết hàm riêng của mình thay thế cho dấu ngoặc nhọn và dấu ngoặc vuông trong hàm băm và mảng bằng khoảng trắng và các ký tự khác.

Tra cứu chức năng gsub cho một cách rất tốt để làm điều đó. Tiếp tục chơi xung quanh với các nhân vật khác nhau và số lượng khoảng trắng khác nhau cho đến khi bạn tìm thấy thứ gì đó trông hấp dẫn. http://ruby-doc.org/core-1.9.3/String.html#method-i-gsub


7
Mảng và băm không có phương thức to_json tích hợp, chúng được thêm bởi ActiveSupport từ Rails.
Tom De Leu

Nó thậm chí còn tệ hơn {"programming_language":{"ruby":{},"python":{}}}
irb / pry

OP không loại trừ Rails
Will Sheppard
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.