[#50466] [ruby-trunk - Bug #7492][Open] Segmentation fault at DL::TestDL#test_call_double on x64 Windows 8 — "phasis68 (Heesob Park)" <phasis@...>

23 messages 2012/12/02

[#50558] [ruby-trunk - Feature #7511][Open] short-circuiting logical implication operator — "rits (First Last)" <redmine@...>

12 messages 2012/12/04

[#50575] [ruby-trunk - Feature #7517][Open] Fixnum::MIN,MAX — "matz (Yukihiro Matsumoto)" <matz@...>

20 messages 2012/12/05

[#50755] Becoming a committer — Charlie Somerville <charlie@...>

Hi ruby-core,

21 messages 2012/12/11
[#50759] Re: Becoming a committer — Yukihiro Matsumoto <matz@...> 2012/12/11

Hi,

[#50784] Re: Becoming a committer — Charles Oliver Nutter <headius@...> 2012/12/11

It's really this easy? If so, I'll send over my public key today :)

[#50795] Re: Becoming a committer — Yukihiro Matsumoto <matz@...> 2012/12/11

Hi,

[#50806] [ruby-trunk - Feature #7548][Open] Load and Require Callbacks — "trans (Thomas Sawyer)" <transfire@...>

12 messages 2012/12/12

[#50810] [ruby-trunk - Feature #7549][Open] A Ruby Design Process — "brixen (Brian Ford)" <brixen@...>

34 messages 2012/12/12

[#50867] [ruby-trunk - Bug #7556][Assigned] test error on refinement — "usa (Usaku NAKAMURA)" <usa@...>

14 messages 2012/12/13

[#50900] [ruby-trunk - Bug #7564][Open] r38175 introduces incompatibility — "tenderlovemaking (Aaron Patterson)" <aaron@...>

14 messages 2012/12/14

[#50951] [ruby-trunk - Bug #7584][Open] Ruby hangs when shutting down an ssl connection in gc finalization — "bpot (Bob Potter)" <bobby.potter@...>

12 messages 2012/12/17

[#51076] [ruby-trunk - Feature #7604][Open] Make === comparison operator ability to delegate comparison to an argument — "prijutme4ty (Ilya Vorontsov)" <prijutme4ty@...>

12 messages 2012/12/22

[#51170] [ruby-trunk - Bug #7629][Open] Segmentation fault — "atd (Antonio Tapiador)" <atapiador@...>

13 messages 2012/12/28

[ruby-core:50826] [ruby-trunk - Feature #5582] Allow clone of singleton methods on a BasicObject

From: "nobu (Nobuyoshi Nakada)" <nobu@...>
Date: 2012-12-12 14:36:15 UTC
List: ruby-core #50826
Issue #5582 has been updated by nobu (Nobuyoshi Nakada).


=begin
2.0 allows `method transplanting'.

  module Clone
    %i[clone initialize_copy initialize_dup initialize_clone].each do |m|
      define_method(m, Kernel.instance_method(m))
    end
  end
=end

----------------------------------------
Feature #5582: Allow clone of singleton methods on a BasicObject
https://bugs.ruby-lang.org/issues/5582#change-34663

Author: thinkerbot (Simon Chiang)
Status: Assigned
Priority: Normal
Assignee: matz (Yukihiro Matsumoto)
Category: 
Target version: next minor


Currently I do not know of a way to implement something like 'clone' on a BasicObject subclass.  This is as close as I've gotten but as you can see the singleton methods are not propagated to the clone.   

    require 'test/unit'

    class Context < BasicObject
      def _singleton_class_
        class << self
          SINGLETON_CLASS = self
          def _singleton_class_
            SINGLETON_CLASS
          end
        end
        _singleton_class_
      end

      def _class_
        _singleton_class_.superclass
      end

      def _extend_(mod)
        mod.__send__(:extend_object, self)
      end

      def _initialize_clone_(orig)
        # set variables as needed
      end

      def _clone_
        clone = _class_.allocate
        clone._initialize_clone_(self)
        _singleton_class_.included_modules.each {|mod| clone._extend_ mod }
        clone
      end
    end

    class ContextTest < Test::Unit::TestCase
      module A
        def a
          :a
        end
      end

      def test__clone__inherits_modules
        context = Context.new
        context._extend_ A
        clone = context._clone_
        assert_equal :a, clone.a
      end

      def test__clone__inherits_singleton_methods
        context = Context.new

        def context.a
          :a
        end

        clone = context._clone_
        assert_equal :a, clone.a  # fails
      end
    end

Is there a way to do this that I don't see? If not, then I request that a way be added - perhaps by allowing the singleton_class to be set somehow.

In my case I am using Context as the context for a dsl where methods write to a target (an instance variable).  I want to be able to clone a context such that I can have multiple contexts with the same methods, including extensions and singletons, that write to different targets.

Thank you.


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

In This Thread

Prev Next