#append_features deprecated?

Discussion in 'Ruby' started by Trans, Dec 3, 2005.

  1. Trans

    Trans Guest

    Somone else mentioned this. Is it true?

    Thanks,
    T.
     
    Trans, Dec 3, 2005
    #1
    1. Advertisements

  2. Trans

    Dave Burt Guest

    This says Module#included " should be used in preference to
    Module.append_features if your code wants to perform some action when a
    module is included in another."

    http://www.ruby-doc.org/core/classes/Module.html#M000704

    Cheers,
    Dave
     
    Dave Burt, Dec 3, 2005
    #2
    1. Advertisements

  3. module M
    def self.included(klass)
    puts "Included in #{klass}"
    end
    end

    class A
    include M # -> Included in A
    end

    class B
    M.append_features(self) # Nothing
    end

    As you can see, Module#append_features doesn't call the .included method
    on the module, include does.


    Cheers,
    Daniel
     
    Daniel Schierbeck, Dec 3, 2005
    #3
  4. Trans

    ts Guest

    D> As you can see, Module#append_features doesn't call the .included method
    D> on the module, include does.

    Well, it's best to see it like this :

    moulon% cat b.rb
    #!/usr/bin/ruby
    module M
    def self.included(klass)
    puts "Included in #{klass}"
    end
    def a
    puts "a"
    end
    end

    class A
    include M
    end

    A.new.a
    moulon%

    moulon% ./b.rb
    Included in A
    a
    moulon%

    moulon% cat b.rb
    #!/usr/bin/ruby
    module M
    def self.append_features(klass)
    puts "Included in #{klass}"
    end
    def a
    puts "a"
    end
    end

    class A
    include M
    end

    A.new.a
    moulon%

    moulon% ./b.rb
    Included in A
    /b.rb:15: undefined method `a' for #<A:0xb7d64b38> (NoMethodError)
    moulon%


    Guy Decoux
     
    ts, Dec 3, 2005
    #4
  5. Oooops, #append_features is private, so it should be

    M.send :append_features, self


    Cheers,
    Daniel
     
    Daniel Schierbeck, Dec 3, 2005
    #5
  6. Um, yeah. `append_features' does the actual work (appending the methods
    of a module to a class/module), `include' just calls `append_features'
    and then `included'.

    class Module
    def include(*mods)
    mods.each do |mod|
    mod.append_features(self)
    mod.included(self)
    end
    end
    end


    Cheers,
    Daniel
     
    Daniel Schierbeck, Dec 3, 2005
    #6
  7. Trans

    ts Guest

    D> Um, yeah. `append_features' does the actual work (appending the methods
    D> of a module to a class/module), `include' just calls `append_features'
    D> and then `included'.

    yes, and this is why you must call super in #append_features (if you
    redefine it) otherwise ruby don't include the module.

    Guy Decoux
     
    ts, Dec 3, 2005
    #7
  8. Yup.
     
    Daniel Schierbeck, Dec 3, 2005
    #8
  9. Trans

    Trans Guest

    It does? Looking at the C code it seems a lot more complicated then
    that.

    T.
     
    Trans, Dec 3, 2005
    #9
  10. I'm sure there's more to it, but from a user's perspective I believe
    that's what's happening ;)


    Cheers,
    Daniel
     
    Daniel Schierbeck, Dec 4, 2005
    #10
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.