Làm cách nào để đổ các trường của đối tượng vào bàn điều khiển?


265

Khi tôi đang chạy một tập lệnh Ruby đơn giản, cách dễ nhất để chuyển các trường của đối tượng vào bàn điều khiển là gì?

Tôi đang tìm kiếm một cái gì đó tương tự như PHP cũng print_r()sẽ hoạt động với mảng.

Câu trả lời:


420

Có khả năng:

puts variable.inspect

15
Thêm một inspectphương thức vào lớp của bạn cho phép bạn xác định cách hiển thị các thuộc tính của lớp, thay vì dựa vào đầu ra mặc định. Rất nhiều lớp không triển khai tốt, nhưng nó có thể thực sự hữu ích khi gỡ lỗi. Ruby sẽ quay trở lại to_snếu nó không thể tìm thấy một phương thức kiểm tra.
Tin Man

4
Liên kết hiện tại bị hỏng, hãy xem liên kết này ruby-doc.org/core-2.0/Object.html#method-i-inspect
SamFlushing

5
server = TCPServer.new 0 ; puts server.inspect #<TCPServer:fd 9> => nil . nó sẽ không hoạt động cho hầu hết các đối tượng phức tạp.
ribamar

Vì đây là câu trả lời đầu tiên được tìm thấy khi tìm kiếm một php var_dumptương đương với ruby, tôi thấy rằng đó pplà rất nhiều usaful trong trường hợp đó, hãy xem tại đây - stackoverflow.com/questions/6501506/ruby-inspect-readability/
Rabin

Lưu ý rằng đó p objectbí danh choputs object.inspect
Jan Klimo

54

Bạn có thể tìm thấy việc sử dụng methodsphương thức trả về một mảng các phương thức cho một đối tượng. Nó không giống như print_r, nhưng đôi khi vẫn hữu ích.

>> "Hello".methods.sort
=> ["%", "*", "+", "<", "<<", "<=", "<=>", "==", "===", "=~", ">", ">=", "[]", "[]=", "__id__", "__send__", "all?", "any?", "between?", "capitalize", "capitalize!", "casecmp", "center", "chomp", "chomp!", "chop", "chop!", "class", "clone", "collect", "concat", "count", "crypt", "delete", "delete!", "detect", "display", "downcase", "downcase!", "dump", "dup", "each", "each_byte", "each_line", "each_with_index", "empty?", "entries", "eql?", "equal?", "extend", "find", "find_all", "freeze", "frozen?", "grep", "gsub", "gsub!", "hash", "hex", "id", "include?", "index", "inject", "insert", "inspect", "instance_eval", "instance_of?", "instance_variable_defined?", "instance_variable_get", "instance_variable_set", "instance_variables", "intern", "is_a?", "is_binary_data?", "is_complex_yaml?", "kind_of?", "length", "ljust", "lstrip", "lstrip!", "map", "match", "max", "member?", "method", "methods", "min", "next", "next!", "nil?", "object_id", "oct", "partition", "private_methods", "protected_methods", "public_methods", "reject", "replace", "respond_to?", "reverse", "reverse!", "rindex", "rjust", "rstrip", "rstrip!", "scan", "select", "send", "singleton_methods", "size", "slice", "slice!", "sort", "sort_by", "split", "squeeze", "squeeze!", "strip", "strip!", "sub", "sub!", "succ", "succ!", "sum", "swapcase", "swapcase!", "taguri", "taguri=", "taint", "tainted?", "to_a", "to_f", "to_i", "to_s", "to_str", "to_sym", "to_yaml", "to_yaml_properties", "to_yaml_style", "tr", "tr!", "tr_s", "tr_s!", "type", "unpack", "untaint", "upcase", "upcase!", "upto", "zip"]

9
Sử dụng hướng nội là một phần thú vị của Ruby. Việc trừ một đối tượng instance_methodsra khỏi lớp ' thường rất hữu ích để có được các phương thức duy nhất:(String.instance_methods - Object.instance_methods).sort
Tin Man

2
đây sẽ là câu trả lời đúng như tôi mong đợi khi tìm trang này.
jaycode

.methods.sortrất hữu ích Có cách nào 'thông minh' để nhanh chóng hiển thị các phương thức (mơ hồ) duy nhất cho đối tượng cụ thể đó không? Ví dụ: một phương thức như .to_scó thể xuất hiện thường xuyên vì vậy nó không hữu ích lắm, nhưng một số phương pháp có thể rất hữu ích khi biết một số phương thức nhất định cho các đối tượng nhất định. Đặc biệt là trong những trường hợp không rõ ràng. Có cách nào để nhanh chóng có được những thứ này? (trong trường hợp, tôi có một PG::Resultđối tượng và muốn nhanh chóng đánh giá các phương pháp có khả năng tôi có thể thấy hữu ích.
stevec

51

Các to_yamlphương pháp có vẻ là đôi khi hữu ích:

$foo = {:name => "Clem", :age => 43}

puts $foo.to_yaml

trả lại

--- 
:age: 43
:name: Clem

(Điều này có phụ thuộc vào một số YAMLmô-đun đang được tải không? Hay điều đó thường có sẵn?)


3
Có, to_yamlyêu cầu mô hình YAML được tải. Nó là một phần của thư viện tiêu chuẩn Ruby.
Chuck

điều này rất hữu ích khi tôi đang cố kiểm tra một đối tượng Amazon S3 trong bảng điều khiển ứng dụng Rails.
Paul

32
p object

Ruby doc cho p.

p(*args) public

Đối với mỗi đối tượng, trực tiếp viết obj.inspect theo sau là một dòng mới đến đầu ra tiêu chuẩn của chương trình.


Nó không giống như biến.to_s? Tôi đã thấy rằng chỉ cần in một tham chiếu đối tượng trừ khi lớp ghi đè lên nó một cách rõ ràng
roryf

15

Nếu bạn đang tìm kiếm chỉ các biến đối tượng trong đối tượng, điều này có thể hữu ích:

obj.instance_variables.map do |var|
  puts [var, obj.instance_variable_get(var)].join(":")
end

hoặc như một lớp lót để sao chép và dán:

obj.instance_variables.map{|var| puts [var, obj.instance_variable_get(var)].join(":")}

10

đặt foo.to_json

có thể có ích vì mô-đun json được tải theo mặc định


4
to_jsonkhông được tải theo mặc định trong 1.8.7 hoặc 1.9.2.
Tin Man

5

Nếu bạn muốn in JSON đã được thụt lề :

require 'json'
...
puts JSON.pretty_generate(JSON.parse(object.to_json))

5

Tôi đã xem qua chủ đề này bởi vì tôi đang tìm kiếm một cái gì đó tương tự. Tôi thích các câu trả lời và họ đã cho tôi một số ý tưởng vì vậy tôi đã thử nghiệm phương pháp .to_hash và cũng hoạt động rất tốt cho trường hợp sử dụng. vậy:

object.to_hash


1
object.attribute_names

# => ["id", "name", "email", "created_at", "updated_at", "password_digest", "remember_token", "admin", "marketing_permissions", "terms_and_conditions", "disable", "black_list", "zero_cost", "password_reset_token", "password_reset_sent_at"]


object.attributes.values

# => [1, "tom", "[email protected]", Tue, 02 Jun 2015 00:16:03 UTC +00:00, Tue, 02 Jun 2015 00:22:35 UTC +00:00, "$2a$10$gUTr3lpHzXvCDhVvizo8Gu/MxiTrazOWmOQqJXMW8gFLvwDftF9Lm", "2dd1829c9fb3af2a36a970acda0efe5c1d471199", true, nil, nil, nil, nil, nil, nil, nil] 

4
undefined method 'attributes' for ...
yegor256

3
object.attributes_namekhông hoạt động, nhưng object.attributesđể có được một hàm băm và giá trị tốt. Điều này đã giúp tôi ra ngoài, cảm ơn!
d3vkit
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.