Forum: Ruby Can't include a module in Enumerable?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
45196398e9685000d195ec626d477f0e?d=identicon&s=25 Trans (Guest)
on 2007-06-23 20:49
(Received via mailing list)
irb(main):002:1> module Z
irb(main):003:1>   def x; "x"; end
irb(main):004:1> end
=> nil
irb(main):005:0> module Enumerable
irb(main):006:1>   include Z
irb(main):007:1> end
=> Enumerable
irb(main):008:0> a = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
irb(main):009:0> a.x
NoMethodError: undefined method `x' for [1, 2, 3, 4, 5]:Array
        from (irb):9
        from :0

Is the Double Inclusion Problem worse than I realized? I thought the
above would be okay b/c 'a' is instantiated _after_ the inclusion
(which is why I've often called it the Dynamic Inclusion Problem).
What gives?

T.
8f6f95c4bd64d5f10dfddfdcd03c19d6?d=identicon&s=25 Rick Denatale (rdenatale)
on 2007-06-23 22:34
(Received via mailing list)
On 6/23/07, Trans <transfire@gmail.com> wrote:
> irb(main):009:0> a.x
> NoMethodError: undefined method `x' for [1, 2, 3, 4, 5]:Array
>         from (irb):9
>         from :0
>
> Is the Double Inclusion Problem worse than I realized? I thought the
> above would be okay b/c 'a' is instantiated _after_ the inclusion
> (which is why I've often called it the Dynamic Inclusion Problem).
> What gives?

It's not the instance, it's the class Array, and that existed (and
included Enumerable) before you changed Enumerable.

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/
31e038e4e9330f6c75ccfd1fca8010ee?d=identicon&s=25 Gregory Brown (Guest)
on 2007-06-23 22:47
(Received via mailing list)
On 6/23/07, Trans <transfire@gmail.com> wrote:
> irb(main):009:0> a.x
> NoMethodError: undefined method `x' for [1, 2, 3, 4, 5]:Array
>         from (irb):9
>         from :0
>
> Is the Double Inclusion Problem worse than I realized? I thought the
> above would be okay b/c 'a' is instantiated _after_ the inclusion
> (which is why I've often called it the Dynamic Inclusion Problem).
> What gives?

Rick answered this, but maybe this is a solution for what you're trying
to do:

>> module ZEnumerable
>>   include Enumerable
>>   def x; "x"; end
>> end

>> class B
>>   include ZEnumerable
>>
?>   def each
>>     [1,2,3].each { |e| yield(e) }
>>   end
>> end

>> class Array
>>   include ZEnumerable
>> end
=> Array
>> [1,2,3].x
=> "x"
>> B.new.map { |e| e + 1 }
=> [2, 3, 4]
>> B.new.x
=> "x"

Yeah, you'd need to go remix existing enumerable classes, but it keeps
you from having to do the additional include for *new* objects
50b2daf0e7666574579b9edaf8f2b69a?d=identicon&s=25 Pit Capitain (Guest)
on 2007-06-24 10:38
(Received via mailing list)
Tom, here's something to experiment with. I haven't tested it
extensively:

  class Module
    alias :old_include :include
    def include other
      old_include other
      if self.class == Module
        this = self
        ObjectSpace.each_object Module do |mod|
          mod.module_eval do include this end if mod < self
        end
      end
    end
  end

  module Z
    def x; "x"; end
  end

  module Enumerable
    include Z
  end

  a = [1,2,3,4,5]
  p a.x  # => "x"

Regards,
Pit
703fbc991fd63e0e1db54dca9ea31b53?d=identicon&s=25 Robert Dober (Guest)
on 2007-06-24 12:28
(Received via mailing list)
On 6/23/07, Trans <transfire@gmail.com> wrote:
> irb(main):009:0> a.x
>
>
Just reinclude Enumerable, well that seems to be the simplest way to
achieve what you wanted:
>
510/10 > irb
irb(main):001:0> module A; def x; 42 end end
=> nil
irb(main):002:0> module Enumerable; include A end
=> Enumerable
irb(main):003:0> class Array; include Enumerable end
=> Array
irb(main):004:0> [].x
=> 42

And yes it works outside irb too.

Robert
45196398e9685000d195ec626d477f0e?d=identicon&s=25 Trans (Guest)
on 2007-06-24 12:48
(Received via mailing list)
On Jun 24, 4:37 am, "Pit Capitain" <pit.capit...@gmail.com> wrote:
>         end
>   end
>
>   a = [1,2,3,4,5]
>   p a.x  # => "x"
>
> Regards,
> Pit

Pit Smack Down! You go and solve the Double Inclusion Problem just
like that!?

There must be a large issue. Why wouldn't Matz have already pursued
this? Granted, I see a little inefficiency, but nothing an Observer
pattern couldn't mitigate. What say you?

I'm Speechless.

T.
50b2daf0e7666574579b9edaf8f2b69a?d=identicon&s=25 Pit Capitain (Guest)
on 2007-06-24 14:02
(Received via mailing list)
2007/6/24, Trans <transfire@gmail.com>:
> Pit Smack Down! You go and solve the Double Inclusion Problem just
> like that!?
>
> There must be a large issue. Why wouldn't Matz have already pursued
> this? Granted, I see a little inefficiency, but nothing an Observer
> pattern couldn't mitigate. What say you?
>
> I'm Speechless.

Tom, thanks for the kind words, but it's really not so hard to find
just one solution to this problem. I can't speak for Matz, but I think
he's looking for a more efficient solution that doesn't require a lot
of bookkeeping.

Regards,
Pit
45196398e9685000d195ec626d477f0e?d=identicon&s=25 Trans (Guest)
on 2007-06-24 17:58
(Received via mailing list)
On Jun 24, 8:01 am, "Pit Capitain" <pit.capit...@gmail.com> wrote:
>
> Tom, thanks for the kind words, but it's really not so hard to find
> just one solution to this problem. I can't speak for Matz, but I think
> he's looking for a more efficient solution that doesn't require a lot
> of bookkeeping.

Okay, I'm being a bit hyperbolic. But you deserve it anyway. I was
surprised to see a solution thrown up in a few lines of code. The
impression I had developed over previous discourse was such a thing
was not readily possible. Of course, now it seems obvious. I knew we
could just re-include the module, I just never put two and two
together.

T.
This topic is locked and can not be replied to.