[#37730] [Ruby 1.9 - Bug #4962][Open] come back gem_prelude! — Yusuke Endoh <mame@...>

24 messages 2011/07/02

[#37840] [Ruby 1.9 - Feature #4985][Open] Add %S[] support for making a list of symbols — Aaron Patterson <aaron@...>

23 messages 2011/07/07

[#37866] [Backport87 - Feature #4996][Open] About 1.8.7 EOL — Shyouhei Urabe <shyouhei@...>

22 messages 2011/07/08

[#37913] [Ruby 1.9 - Bug #5003][Open] Enumerator#next segfaults in OS X Lion (10.7) — Ganesh Gunasegaran <ganesh.gunas@...>

16 messages 2011/07/09

[#37917] [Ruby 1.9 - Feature #5005][Open] Provide convenient access to original methods — Lazaridis Ilias <ilias@...>

13 messages 2011/07/09

[#37932] [Ruby 1.9 - Feature #5008][Open] Equal rights for Hash (like Array, String, Integer, Float) — Suraj Kurapati <sunaku@...>

31 messages 2011/07/09

[#37936] [Ruby 1.9 - Feature #5010][Open] Add Slop(-like) in stdlib and deprecate current OptionParser API — Rodrigo Rosenfeld Rosas <rr.rosas@...>

29 messages 2011/07/09

[#37968] [Ruby 1.9 - Bug #5015][Open] method_added" is called in addition to "method_undefined — Lazaridis Ilias <ilias@...>

14 messages 2011/07/10

[#38096] [Ruby 1.9 - Feature #5033][Open] PATCH: 1.9: gc_mark_children: Avoid gc_mark() tail recursion, use goto again. — Kurt Stephens <ks.ruby@...>

14 messages 2011/07/16

[#38109] [Ruby 1.9 - Bug #5034][Open] C Source Code formatting — Lazaridis Ilias <ilias@...>

18 messages 2011/07/16

[#38171] [Ruby 1.9 - Bug #5047][Open] Segfault (most likely involving require) — Jack Christensen <jack@...>

21 messages 2011/07/18

[#38182] [Ruby 1.9 - Feature #5054][Open] Compress a sequence of ends — ANDO Yasushi ANDO <andyjpn@...>

68 messages 2011/07/19

[#38197] [Ruby 1.9 - Feature #5056][Open] About 1.9 EOL — Shyouhei Urabe <shyouhei@...>

39 messages 2011/07/19
[#38900] [Ruby 1.9 - Feature #5056] About 1.9 EOL — Shota Fukumori <sorah@...> 2011/08/10

[#38902] Re: [Ruby 1.9 - Feature #5056] About 1.9 EOL — Yukihiro Matsumoto <matz@...> 2011/08/10

Hi,

[#39048] Re: [Ruby 1.9 - Feature #5056] About 1.9 EOL — SASADA Koichi <ko1@...> 2011/08/22

Hi,

[#39055] Re: [Ruby 1.9 - Feature #5056] About 1.9 EOL — Lucas Nussbaum <lucas@...> 2011/08/23

On 23/08/11 at 06:50 +0900, SASADA Koichi wrote:

[#38295] [Ruby 1.9 - Feature #5064][Open] HTTP user-agent class — Eric Hodel <drbrain@...7.net>

15 messages 2011/07/21

[#38391] [Ruby 1.9 - Bug #5076][Open] Mac OS X Lion Support — Yui NARUSE <naruse@...>

17 messages 2011/07/22

[#38503] [Ruby 1.9 - Feature #5096][Open] offer Logger-compatibility for ext — Eric Wong <normalperson@...>

16 messages 2011/07/25

[#38510] [Ruby 1.9 - Feature #5097][Assigned] Supported platforms of Ruby 1.9.3 — Yui NARUSE <naruse@...>

42 messages 2011/07/26

[#38526] [Backport92 - Backport #5099][Open] Backport r31875 load path performance problem — Aaron Patterson <aaron@...>

19 messages 2011/07/26

[#38538] [Ruby 1.9 - Feature #5101][Open] allow optional timeout for TCPSocket.new — Eric Wong <normalperson@...>

15 messages 2011/07/27

[#38610] [Ruby 1.9 - Feature #5120][Open] String#split needs to be logical — Alexey Muranov <muranov@...>

18 messages 2011/07/30

[#38623] [Ruby 1.9 - Feature #5123][Open] Alias Hash 1.9 as OrderedHash — Alexey Muranov <muranov@...>

14 messages 2011/07/31

[ruby-core:38159] Questions about Module#mix

From: Yehuda Katz <wycats@...>
Date: 2011-07-18 07:19:14 UTC
List: ruby-core #38159
Hi,

I have seen Matz propose a new feature: Module#mix several times for
inclusion in a future version of Ruby.

I am unsure about what use-case #mix is attempting to help with. In current
Ruby, all modules are including in the ancestor hierarchy. This means that
it is possible to use modules as a form of runtime extension of the class
hierarchy, and to use `super` between included modules.

This allows us to build an abstract class and several optional modules that
are included into a subclass if they are needed. We use this pattern quite a
lot in Rails. For instance, ActionController::Metal is a superclass, and a
large number of possible ActionController modules are available to perform
different operations. You can see the modules here:
https://github.com/rails/rails/tree/master/actionpack/lib/action_controller/metal.
For instance, there is an ImplicitRender module  (
https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/implicit_render.rb#L3-7),
which overrides action dispatching to render a default if no rendering
occurred.

This pattern is extremely powerful. In contrast, the #mix proposal assumes
that using the same method name is an *error*, and requires renaming the
method in order to proceed. This makes working with multiple cooperating
modules harder and more error-prone.

The one nice thing about #mix is that it inserts the module's methods in
front of the class, rather than behind it. This makes it possible to extend
an existing class that is not architected for cooperating modules (like
Rails is). An alternate open proposal, Module#prepend, would give us the
benefit of extending existing classes while preserving the ability to insert
multiple cooperating modules.

I have attached a diagram showing the three different approaches (Ruby
1.9.2, #mix, and #prepend).

I'd still be concerned if we added both #prepend and #mix, because #mix
introduces new module semantics, so we'd now have two different modules
systems with subtly different semantics. This introduced some of the issues
illustrated in Matz's post a month ago (
http://ruby-dev.route477.net/posts/43620). Even if fixed, it would require
new Ruby users to understand both the mix-style of including modules
(combining into the class), the normal (traditional) style, and any
interactions between the styles.

Thank you for your consideration,

Yehuda Katz
Chief Technologist | Strobe
(ph) 718.877.1325

Attachments (1)

Picture.jpg (71.8 KB)
Picture.jpg

In This Thread

Prev Next