On 12 ον, 17:39, Ilias Lazaridis <il... / lazaridis.com> wrote:
> On 10 ïýí, 01:30, Yukihiro Matsumoto <m... / ruby-lang.org> wrote:
>
>
>
>
>
>
>
> > Hi,
>
> > In message "Re: CORE - Literal Instantiation breaks Object Model"
> >   on Fri, 10 Jun 2011 03:40:27 +0900, Ilias Lazaridis <il... / lazaridis.com> writes:
>
> > |The behaviour of the class String has been altered, whilst using the
> > |standard mechanisms of the Object Model.
> > |
> > |To my huge surprise, although the li_string has been instantiated as
> > |an object of class String, the new initialize method was not called.
> > |
> > |This is essentially a defect, as the consistency of the Object Model
> > |breaks.
>
> [...]
> > String objects for literals are already created in the compile time, which is far
> > before you redefine the initialize method. 
>
> [...]
>
> This should not matter.
>
> In context of irb this becomes more clear (redefinition of the
> initialize method happens clearly before it's usage.).
>
> #String2.rb
> class String
>  def initialize(val)
>   self.replace(val)
>   puts object_id
>  end
>  def my_method_test
>   print self.inspect, " test\n"

correction, replace:
  print self.inspect, " test\n"
with:
  'has method <my_method_test>'

>  end
> end
>
> # command line
> $ irb
>
> irb(main):001:0> original = String.new("original")
> => "original"
> irb(main):002:0> load "String2.rb"
> => true
> irb(main):003:0> altered = String.new("altered")
> 21878604
> => "altered"
> irb(main):004:0> altered.my_method_test
> => "has method <my_method_test>"
> irb(main):005:0> literal = "literal"
> => "literal"
> irb(main):006:0> literal.my_method_test
> => "has method <my_method_test>"
> irb(main):007:0>
>
> -
>
> The initialize method is an integral part of the class String.
>
> From the moment that "String2.rb" is loaded, the initialize method of
> class String has been validly redefined.
>
> (The behaviour of the String class within the "irb session" is
> altered)
>
> The altered initialize method is now an integral part of the class
> String.
>
> The altered String object behaves as expected (responds to
> "my_method_test, initialized via redefined initialize method).
>
> The String(Literal) object responds to "my_method_test", but it is was
> not initialized with the redefined initialize method.
>
> -
>
> The "Literal Instantiation" calls the original (core-C-level) String
> initialize method instead of the redefined one (user-language-level).
>
> This *breaks* the object model.
>
> .
>
--
http://lazaridis.com