Ruby: Module, Mixins and Blocks confusing?

前端 未结 5 626
忘了有多久
忘了有多久 2021-01-15 12:55

Following is the code I tried to run from the Ruby Programming Book http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html

Why doesn\'t the

5条回答
  •  再見小時候
    2021-01-15 13:25

    The following code is not very elaborated. Just to show you that today you already have means, like the hooks called by Ruby when certain events occur, to check which method (from the including class or the included module) will be used/not used.

    module Inject
        def self.append_features(p_host) # don't use included, it's too late
            puts "#{self} included into #{p_host}"
            methods_of_this_module = self.instance_methods(false).sort
            print "methods of #{self} : "; p methods_of_this_module
            first_letter = []
            methods_of_this_module.each do |m|
                first_letter << m[0, 2]
            end
            print 'selection to reduce the display : '; p first_letter
            methods_of_host_class = p_host.instance_methods(true).sort
            subset = methods_of_host_class.select { |m| m if first_letter.include?(m[0, 2]) }
            print "methods of #{p_host} we are interested in: "; p subset
            methods_of_this_module.each do |m|
                puts "#{self.name}##{m} will not be used" if methods_of_host_class.include? m
            end
    
            super # <-- don't forget it !
        end
    

    Rest as in your post. Execution :

    $ ruby -v
    ruby 1.8.6 (2010-09-02 patchlevel 420) [i686-darwin12.2.0]
    $ ruby -w tinject.rb 
    Inject included into Array
    methods of Inject : ["inject", "product", "sum"]
    selection to reduce the display : ["in", "pr", "su"]
    methods of Array we are interested in: ["include?", "index",  
     ..., "inject", "insert", ..., "instance_variables", "private_methods", "protected_methods"]
    Inject#inject will not be used
    $ rvm use 1.9.2
    ...
    $ ruby -v
    ruby 1.9.2p320 (2012-04-20 revision 35421) [x86_64-darwin12.2.0]
    $ ruby -w tinject.rb 
    Inject included into Array
    methods of Inject : [:inject, :product, :sum]
    selection to reduce the display : ["in", "pr", "su"]
    methods of Array we are interested in: [:include?, :index, ..., :inject, :insert, 
    ..., :private_methods, :product, :protected_methods]
    Inject#inject will not be used
    Inject#product will not be used
    

提交回复
热议问题