Prev: Read text file and set the values in the Variables
Next: How to pass data from one textbox to another one?
From: Jian Lin on 19 May 2010 04:40 When it is RoR, we can use ActiveRecord's attributes method to get a hash for a record's column name and values. How about if it is just an object in Ruby, and we want to print out all instance variables to debug, while the inspect() method doesn't print everything out, is there a way to print out all instance variables (for any object) automatically, for example, to debug the code? thanks. -- Posted via http://www.ruby-forum.com/.
From: Jian Lin on 19 May 2010 16:57 Jian Lin wrote: > require 'pp' works until inspect is redefined, then it will stop working > and give the following error. thanks for giving out starting pointers > though. on the other hand, if inspect() is to return a string representation, then 'pp' still works except it doesn't print out all the instance variables: irb(main):026:0> class Point irb(main):027:1> def inspect irb(main):028:2> "#@x #@y and i am a point" irb(main):029:2> end irb(main):030:1> end => nil irb(main):031:0> p => 1 2 and i am a point irb(main):032:0> p p 1 2 and i am a point => nil irb(main):033:0> pp p # note that @something is not printed out 1 2 and i am a point => nil irb(main):034:0> -- Posted via http://www.ruby-forum.com/.
From: Caleb Clausen on 19 May 2010 17:02 On 5/19/10, Jian Lin <blueskybreeze(a)gmail.com> wrote: > Dhruva Sagar wrote: >> require 'pp' >> pp object_reference > > > hm, looks like inspect() by default will print out all the instance > variables... > > but what if not using inspect()? such as wanting to print them out in a > table format, between <td> and </td> tags? > > require 'pp' works until inspect is redefined, then it will stop working > and give the following error. thanks for giving out starting pointers > though. > > irb(main):009:0> class Point > irb(main):010:1> def initialize(x,y) > irb(main):011:2> @x,@y = x,y > irb(main):012:2> @something = 1 > irb(main):013:2> end > irb(main):014:1> end > => nil > irb(main):015:0> p = Point.new(1,2) > => #<Point:0x253f260 @y=2, @x=1, @something=1> > > irb(main):016:0> p p > #<Point:0x253f260 @y=2, @x=1, @something=1> > => nil > > irb(main):017:0> class Point > irb(main):018:1> def inspect > irb(main):019:2> p @x, @y > irb(main):020:2> end > irb(main):021:1> end > => nil > irb(main):022:0> p > 1 > 2 > => > irb(main):023:0> p p > 1 > 2 > > => nil > irb(main):024:0> require 'pp' > => true > irb(main):025:0> pp p > 1 > 2 > NoMethodError: undefined method `length' for nil:NilClass > from c:/Ruby/lib/ruby/1.8/prettyprint.rb:144:in `text' > from c:/Ruby/lib/ruby/1.8/pp.rb:259:in `pretty_print' > from c:/Ruby/lib/ruby/1.8/pp.rb:140:in `pp' > from c:/Ruby/lib/ruby/1.8/prettyprint.rb:201:in `group' > from c:/Ruby/lib/ruby/1.8/prettyprint.rb:227:in `nest' > from c:/Ruby/lib/ruby/1.8/prettyprint.rb:200:in `group' > from c:/Ruby/lib/ruby/1.8/prettyprint.rb:212:in `group_sub' > from c:/Ruby/lib/ruby/1.8/prettyprint.rb:199:in `group' > from c:/Ruby/lib/ruby/1.8/pp.rb:140:in `pp' > from c:/Ruby/lib/ruby/1.8/pp.rb:77:in `pp' > from c:/Ruby/lib/ruby/1.8/pp.rb:119:in `guard_inspect_key' > from c:/Ruby/lib/ruby/1.8/pp.rb:77:in `pp' > from c:/Ruby/lib/ruby/1.8/pp.rb:60:in `pp' > from c:/Ruby/lib/ruby/1.8/pp.rb:59:in `each' > from c:/Ruby/lib/ruby/1.8/pp.rb:59:in `pp' > from (irb):25 > irb(main):026:0> Your definition of inspect is bad. inspect should just return a string; it shouldn't try to print out anything itself. If you just want to get back to the original definition of inspect in a class that has redefined it, use this trick: Object.instance_method(:inspect).bind(x).call where x is the variable that you want to inspect.
From: Jian Lin on 19 May 2010 16:54 Dhruva Sagar wrote: > require 'pp' > pp object_reference hm, looks like inspect() by default will print out all the instance variables... but what if not using inspect()? such as wanting to print them out in a table format, between <td> and </td> tags? require 'pp' works until inspect is redefined, then it will stop working and give the following error. thanks for giving out starting pointers though. irb(main):009:0> class Point irb(main):010:1> def initialize(x,y) irb(main):011:2> @x,@y = x,y irb(main):012:2> @something = 1 irb(main):013:2> end irb(main):014:1> end => nil irb(main):015:0> p = Point.new(1,2) => #<Point:0x253f260 @y=2, @x=1, @something=1> irb(main):016:0> p p #<Point:0x253f260 @y=2, @x=1, @something=1> => nil irb(main):017:0> class Point irb(main):018:1> def inspect irb(main):019:2> p @x, @y irb(main):020:2> end irb(main):021:1> end => nil irb(main):022:0> p 1 2 => irb(main):023:0> p p 1 2 => nil irb(main):024:0> require 'pp' => true irb(main):025:0> pp p 1 2 NoMethodError: undefined method `length' for nil:NilClass from c:/Ruby/lib/ruby/1.8/prettyprint.rb:144:in `text' from c:/Ruby/lib/ruby/1.8/pp.rb:259:in `pretty_print' from c:/Ruby/lib/ruby/1.8/pp.rb:140:in `pp' from c:/Ruby/lib/ruby/1.8/prettyprint.rb:201:in `group' from c:/Ruby/lib/ruby/1.8/prettyprint.rb:227:in `nest' from c:/Ruby/lib/ruby/1.8/prettyprint.rb:200:in `group' from c:/Ruby/lib/ruby/1.8/prettyprint.rb:212:in `group_sub' from c:/Ruby/lib/ruby/1.8/prettyprint.rb:199:in `group' from c:/Ruby/lib/ruby/1.8/pp.rb:140:in `pp' from c:/Ruby/lib/ruby/1.8/pp.rb:77:in `pp' from c:/Ruby/lib/ruby/1.8/pp.rb:119:in `guard_inspect_key' from c:/Ruby/lib/ruby/1.8/pp.rb:77:in `pp' from c:/Ruby/lib/ruby/1.8/pp.rb:60:in `pp' from c:/Ruby/lib/ruby/1.8/pp.rb:59:in `each' from c:/Ruby/lib/ruby/1.8/pp.rb:59:in `pp' from (irb):25 irb(main):026:0> -- Posted via http://www.ruby-forum.com/.
From: Gabriel Horner on 19 May 2010 17:26
Jian Lin wrote: > When it is RoR, we can use ActiveRecord's attributes method to get a > hash for a record's column name and values. How about if it is just an > object in Ruby, and we want to print out all instance variables to > debug, while the inspect() method doesn't print everything out, is there > a way to print out all instance variables (for any object) > automatically, for example, to debug the code? thanks. I just use the following irb command: def instance_var(obj) obj.instance_variables.map {|e| [e, obj.instance_variable_get(e)] } end If you define the irb command as a boson command, you get a nice ascii table of an object's instance variables: http://tagaholic.me/2009/11/07/ruby-reference-commands-with-boson.html#object_instance_variables -- Posted via http://www.ruby-forum.com/. |