Issue #4845 has been updated by Lazaridis Ilias.


Yukihiro Matsumoto wrote:
> Besides that, I strongly discourage to intercept literal creation, since it would change the semantics of the fundamental object model.

Discouraging and disabling are two different things.

The fundamental object model does not distinguish between "objects" and "literal_objects".

The code demonstrates in a simple manner: the created object is of class String, but is treated differently which means essentially that the OO model breaks.

Currently, I am unable to implement a unique way to handle *all* my string objects (or other objects which are instantiated via literals).

Is there any workaround available?
----------------------------------------
Feature #4845: Provide Class#cb_object_instantiated_from_literal(object)
http://redmine.ruby-lang.org/issues/4845

Author: Lazaridis Ilias
Status: Rejected
Priority: Low
Assignee: Yukihiro Matsumoto
Category: core
Target version: 


(assuming that this is not a bug, but a speed tradeoff / known issue)

class String
  alias_method :orig_initialize, :initialize  
  def initialize(val)
    orig_initialize "OBSERVED: " + val
  end
  def my_method_test
    print self.inspect, " test\n"
  end
end

oo_string = String.new("The OO String")
li_string = "The Literal String"

print "Class: ", oo_string.class, " - content: ", oo_string, "\n"
print "Class: ", li_string.class, " - content: ", li_string, "\n"
oo_string.my_method_test
li_string.my_method_test

#OUTPUT
#=> Class: String - content: OBSERVED: The OO String
#=> Class: String - content: The Literal String
#=> "OBSERVED: The OO String" test
#=> "The Literal String" test

-

The li_string is an object of class String and responds to the added method "my_method_test".

But: the initialize method of the modified String class was not called during instantiation.

Is there any chance that this will be changed, thus the "initialize" method is called (if implemented)?

If not, the suggestion would be:

* provide a call-back Class#cb_object_instantiated_from_literal(object) (or similar)

Benefits:

* minimal overhead if not used (C-level if *ptr available, call)
* allows simple notification about new objects.






-- 
http://redmine.ruby-lang.org