কীভাবে আমি কোনও বস্তুর ক্ষেত্রগুলি কনসোলে ফেলে দেব?


264

যখন আমি একটি সাধারণ রুবি স্ক্রিপ্টটি চালাচ্ছি, তখন কোনও আইনের ক্ষেত্রগুলি কনসোলে ফেলে দেওয়ার সহজ উপায় কী?

আমি পিএইচপি এর অনুরূপ কিছু সন্ধান করছি print_r()যা অ্যারেগুলির সাথেও কাজ করবে।

উত্তর:


420

সম্ভবত:

puts variable.inspect

15
inspectআপনার ক্লাসে একটি পদ্ধতি যুক্ত করা আপনাকে ডিফল্ট আউটপুট নির্ভর না করে শ্রেণীর বৈশিষ্ট্যগুলি কীভাবে প্রদর্শিত হবে তা নির্ধারণ করতে দেয় allows অনেকগুলি ক্লাস এটিকে ভালভাবে প্রয়োগ করে না তবে ডিবাগ করার সময় এটি সত্যিই কার্যকর হতে পারে। রুবি to_sযদি কোনও পরিদর্শনকারী পদ্ধতি না খুঁজে পায় তবে তা ফিরে আসবে ।
টিন ম্যান

4
বর্তমান লিঙ্কটি অসম্পূর্ণ, এই এক দেখুন ruby-doc.org/core-2.0/Object.html#method-i-inspect
SamFlushing

5
server = TCPServer.new 0 ; puts server.inspect #<TCPServer:fd 9> => nil । এটি বেশিরভাগ জটিল বস্তুর জন্য কাজ করবে না।
ribamar

এই প্রথম উত্তর পাওয়া হয় যখন একটি পিএইচপি খুঁজছেন var_dumpরুবি মধ্যে সমতুল্য, আমি দেখেছি যে ppযে ক্ষেত্রে অনেক usaful, এখানে বর্ণন - stackoverflow.com/questions/6501506/ruby-inspect-readability/...
রবিন

লক্ষ্য করুন p objectএকজন ওরফে জন্যputs object.inspect
জানুয়ারী Klimo

54

আপনি কোনও methodsপদ্ধতির জন্য এমন কোনও ব্যবহার খুঁজে পেতে পারেন যা কোনও অবজেক্টের জন্য পদ্ধতির অ্যারে প্রদান করে। এটি এর মতো নয় print_r, তবে সময়ে সময়ে দরকারী।

>> "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
আত্মপরিচয় ব্যবহার করা রুবির মজার অংশ। instance_methodsঅনন্য পদ্ধতিগুলি জানতে প্রশ্নে ক্লাস থেকে কোনও অবজেক্টকে বিয়োগ করা প্রায়শই দরকারী :(String.instance_methods - Object.instance_methods).sort
টিন ম্যান

2
এই পৃষ্ঠাগুলি সন্ধান করার সময় এটির সঠিক উত্তর হওয়া উচিত।
জয়কোড

.methods.sortখুব দরকারী। Particular নির্দিষ্ট বস্তুর সাথে (অস্পষ্টভাবে) অনন্য পদ্ধতিগুলি দ্রুত দেখানোর জন্য কোনও 'স্মার্ট' উপায় আছে কি? যেমন একটি পদ্ধতি .to_sপ্রায়শই দেখাতে পারে তাই এটি সমস্ত দরকারী নয়, তবে কিছু কিছু নির্দিষ্ট বিষয়গুলির জন্য নির্দিষ্ট পদ্ধতি সম্পর্কে জানা খুব সহজ কাজ হতে পারে। বিশেষত ক্ষেত্রে যেগুলি সুস্পষ্ট নয়। এগুলি দ্রুত পাওয়ার কোনও উপায় আছে কি? ( PG::Result
ঘটনাচক্রে

50

to_yamlপদ্ধতি দরকারী কখনও কখনও মনে করা হয়:

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

puts $foo.to_yaml

আয়

--- 
:age: 43
:name: Clem

(এটি কি কোনও YAMLমডিউল লোড হচ্ছে তার উপর নির্ভর করে ? বা এটি সাধারণত উপলব্ধ হবে?)


3
হ্যাঁ, to_yamlওয়াইএএমএল মডেলটি লোড হওয়া দরকার। যদিও এটি রুবি স্ট্যান্ডার্ড লাইব্রেরির অংশ।
ছক

আমি যখন একটি রেল অ্যাপ্লিকেশন কনসোলটিতে একটি অ্যামাজন এস 3 অবজেক্টটি পরীক্ষা করার চেষ্টা করছিলাম তখন এটি সহায়ক হয়েছিল।
পল

32
p object

রুবি ডক p

p(*args) public

প্রতিটি বস্তুর জন্য, সরাসরি obj.inspect লিখে প্রোগ্রামের স্ট্যান্ডার্ড আউটপুটে একটি নতুন লাইন পরে।


এটি কি ভেরিয়েবল.টো_স হিসাবে একই নয়? আমি খুঁজে পেয়েছি যে ক্লাসটি সুস্পষ্টভাবে ওভাররাইড না করে কেবল একটি অবজেক্ট রেফারেন্স প্রিন্ট করে
roryf

15

আপনি যদি অবজেক্টটিতে কেবল উদাহরণের পরিবর্তনশীলগুলির সন্ধান করেন তবে এটি কার্যকর হতে পারে:

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

বা অনুলিপি এবং পেস্ট করার জন্য ওয়ান-লাইনার হিসাবে:

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

10

foo.to_json রাখে

জেসন মডিউলটি ডিফল্টরূপে লোড হওয়ার পরে কার্যকর হতে পারে


4
to_json1.8.7 বা 1.9.2 এ ডিফল্টরূপে লোড করা হয়নি।
টিন ম্যান

5

আপনি যদি ইতিমধ্যে ইন্টেন্টেড JSON মুদ্রণ করতে চান :

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

5

আমি এই থ্রেডটি পেরিয়ে এসেছি কারণ আমি একই জাতীয় কিছু খুঁজছিলাম। আমি প্রতিক্রিয়াগুলি পছন্দ করি এবং তারা আমাকে কিছু ধারণা দেয় তাই আমি। টো-হ্যাশ পদ্ধতিটি পরীক্ষা করেছিলাম এবং ব্যবহারের ক্ষেত্রেও খুব ভাল কাজ করেছি। Soo:

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", "tom@tom.com", 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_nameকাজ করে না, তবে object.attributesকী এবং মানগুলির একটি দুর্দান্ত হ্যাশ পেতে পারে। এটি আমাকে সাহায্য করেছে, ধন্যবাদ!
d3vkit
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.