[#5563] Non-overridable and non-redefinable methods — Eric Mahurin <eric_mahurin@...>

Lately, I've been thinking about the future of ruby

44 messages 2005/08/19
[#5564] Re: Non-overridable and non-redefinable methods — Austin Ziegler <halostatue@...> 2005/08/19

On 8/19/05, Eric Mahurin <eric_mahurin@yahoo.com> wrote:

[#5571] Re: Non-overridable and non-redefinable methods — Eric Mahurin <eric_mahurin@...> 2005/08/19

--- Austin Ziegler <halostatue@gmail.com> wrote:

[#5574] Re: Non-overridable and non-redefinable methods — TRANS <transfire@...> 2005/08/20

Just wanted to add a few things.

[#5581] Re: Non-overridable and non-redefinable methods — Austin Ziegler <halostatue@...> 2005/08/20

On 8/19/05, TRANS <transfire@gmail.com> wrote:

[#5583] Re: Non-overridable and non-redefinable methods — "David A. Black" <dblack@...> 2005/08/20

Hi --

[#5585] Re: Non-overridable and non-redefinable methods — Eric Mahurin <eric_mahurin@...> 2005/08/20

--- "David A. Black" <dblack@wobblini.net> wrote:

[#5609] Pathname#walk for traversing path nodes (patch) — ES <ruby-ml@...>

Here is a small addition to Pathname against 1.9, probably suited

20 messages 2005/08/22

[PATCH] ostruct.rb: recursive inspect, .send with exotic symbols, return value of assignment

From: =?ISO-8859-15?Q?Florian_Gro=DF?= <florgro@...>
Date: 2005-08-07 09:29:50 UTC
List: ruby-core #5532
Moin.

I've attached a patch for ostruct.rb (against 1.8.2, but I don't think 
there was changes to it lately) which makes the following work:

> irb(main):001:0> o = OpenStruct.new                      
> => #<OpenStruct>                                         
> irb(main):002:0> o.o = o                                 
> => #<OpenStruct o=#<OpenStruct ...>>                     
> irb(main):003:0> o.foo = "bar"                           
> => "bar"                                                 
> irb(main):004:0> o                                       
> => #<OpenStruct foo="bar", o=#<OpenStruct ...>>          
> irb(main):005:0> o.to_s                                  
> => "#<OpenStruct foo=\"bar\", o=#<OpenStruct ...>>"      
> irb(main):006:0> o.send(:"->=", "foo")                   
> => "foo"                                                 
> irb(main):007:0> o                                       
> => #<OpenStruct ->="foo", foo="bar", o=#<OpenStruct ...>>

It's mostly just small changes, but I think the recursive inspect is 
actually important. Making the inspect result more consistent with 
Object#inspect is probably also a good idea.

Regards,
Florian Gross

Attachments (1)

ostruct.patch (1.56 KB, text/x-diff)
--- ostruct.rb.original	2005-08-07 10:43:53.257125000 +0200
+++ ostruct.rb	2005-08-07 11:18:15.944625000 +0200
@@ -68,11 +68,11 @@
   end
 
   def new_ostruct_member(name)
+    name = name.to_sym
     unless self.respond_to?(name)
-      self.instance_eval %{
-        def #{name}; @table[:#{name}]; end
-        def #{name}=(x); @table[:#{name}] = x; end
-      }
+      meta = class << self; self; end
+      meta.send(:define_method, name) { @table[name] }
+      meta.send(:define_method, :"#{name}=") { |x| @table[name] = x }
     end
   end
 
@@ -87,8 +87,8 @@
 	raise TypeError, "can't modify frozen #{self.class}", caller(1)
       end
       mname.chop!
-      @table[mname.intern] = args[0]
       self.new_ostruct_member(mname)
+      @table[mname.intern] = args[0]
     elsif len == 0
       @table[mid]
     else
@@ -103,16 +103,35 @@
     @table.delete name.to_sym
   end
 
+  InspectKey = :__inspect_key__ # :nodoc:
+
   #
   # Returns a string containing a detailed summary of the keys and values.
   #
   def inspect
-    str = "<#{self.class}"
+    str = "#<#{self.class}"
+
+    Thread.current[InspectKey] ||= []
+    if Thread.current[InspectKey].include?(self) then
+      str << " ..."
+    else
+      first = true
     for k,v in @table
+        str << "," unless first
+        first = false
+
+        Thread.current[InspectKey] << v
+        begin
       str << " #{k}=#{v.inspect}"
+        ensure
+          Thread.current[InspectKey].pop
+        end
     end
+    end
+
     str << ">"
   end
+  alias :to_s :inspect
 
   attr_reader :table # :nodoc:
   protected :table

In This Thread

Prev Next