[#24648] [Bug #1852] Enumerable's #hash Raises ArgumentError When Recursive Values are Present — Run Paint Run Run <redmine@...>

Bug #1852: Enumerable's #hash Raises ArgumentError When Recursive Values are Present

20 messages 2009/08/01
[#24649] Re: [Bug #1852] Enumerable's #hash Raises ArgumentError When Recursive Values are Present — Tanaka Akira <akr@...> 2009/08/01

In article <4a73e51b5a4f9_138119f2a982704e@redmine.ruby-lang.org>,

[#24652] Re: [Bug #1852] Enumerable's #hash Raises ArgumentError When Recursive Values are Present — Run Paint Run Run <runrun@...> 2009/08/01

> Is it valuable to implement such function?

[#24682] Re: [Bug #1852] Enumerable's #hash Raises ArgumentError When Recursive Values are Present — Tanaka Akira <akr@...> 2009/08/02

In article <67e307490908010125r6fa76654pa8e2224f714588fc@mail.gmail.com>,

[#24673] [Feature #1857] install *.h and *.inc — Roger Pack <redmine@...>

Feature #1857: install *.h and *.inc

21 messages 2009/08/01

[#24732] [Bug #1873] MatchData#[]: Omits All But Last Captures Corresponding to the Same Named Group — Run Paint Run Run <redmine@...>

Bug #1873: MatchData#[]: Omits All But Last Captures Corresponding to the Same Named Group

12 messages 2009/08/03

[#24775] [Feature #1889] Teach Onigurma Unicode 5.0 Character Properties — Run Paint Run Run <redmine@...>

Feature #1889: Teach Onigurma Unicode 5.0 Character Properties

30 messages 2009/08/05

[#24786] [Bug #1893] Recursive Enumerable#join is surprising — Jeremy Kemper <redmine@...>

Bug #1893: Recursive Enumerable#join is surprising

24 messages 2009/08/06
[#28422] [Bug #1893] Recursive Enumerable#join is surprising — Yusuke Endoh <redmine@...> 2010/03/02

Issue #1893 has been updated by Yusuke Endoh.

[#28438] Re: [Bug #1893] Recursive Enumerable#join is surprising — Yukihiro Matsumoto <matz@...> 2010/03/03

Hi,

[#24854] embedding ruby 1.9 frustration — Rolando Abarca <funkaster@...>

Hello,

12 messages 2009/08/10

[#24982] [Feature #1961] Kernel#__dir__ — Yutaka HARA <redmine@...>

Feature #1961: Kernel#__dir__

26 messages 2009/08/19
[#28898] [Feature #1961] Kernel#__dir__ — Roger Pack <redmine@...> 2010/03/23

Issue #1961 has been updated by Roger Pack.

[#28900] Re: [Feature #1961] Kernel#__dir__ — Kornelius Kalnbach <murphy@...> 2010/03/23

On 23.03.10 19:10, Roger Pack wrote:

[#25025] [Backport #1975] Backport Dir.mktmpdir — Kirk Haines <redmine@...>

Backport #1975: Backport Dir.mktmpdir

12 messages 2009/08/21

[#25041] Proposal: Simpler block format — Yehuda Katz <wycats@...>

I'd like to propose that we add the following syntax for procs in Ruby:

45 messages 2009/08/23
[#25046] Re: Proposal: Simpler block format — Caleb Clausen <caleb@...> 2009/08/23

Yehuda Katz wrote:

[#25049] Re: Proposal: Simpler block format — Yehuda Katz <wycats@...> 2009/08/23

On Sat, Aug 22, 2009 at 7:38 PM, Caleb Clausen <caleb@inforadical.net>wrote:

[#25058] Re: Proposal: Simpler block format — Yukihiro Matsumoto <matz@...> 2009/08/23

Hi,

[#25059] Re: Proposal: Simpler block format — Yehuda Katz <wycats@...> 2009/08/23

On Sun, Aug 23, 2009 at 3:33 PM, Yukihiro Matsumoto <matz@ruby-lang.org>wrote:

[#25063] Re: Proposal: Simpler block format — "David A. Black" <dblack@...> 2009/08/23

Hi --

[#25068] Re: Proposal: Simpler block format — brian ford <brixen@...> 2009/08/24

Hi,

[#25086] [Bug #1991] ruby should use twolevel namespace on OS X — Michal Suchanek <redmine@...>

Bug #1991: ruby should use twolevel namespace on OS X

12 messages 2009/08/24

[#25208] Module#prepend and Array#prepend — Yehuda Katz <wycats@...>

Matz,

23 messages 2009/08/30

[#25210] [Feature #2022] Patch for ruby-1.8.6 and openssl-1.0 — Jeroen van Meeuwen <redmine@...>

Feature #2022: Patch for ruby-1.8.6 and openssl-1.0

15 messages 2009/08/30

[#25220] [Bug #2026] String encodings are not supported by most of IO on Linux — Vit Ondruch <redmine@...>

Bug #2026: String encodings are not supported by most of IO on Linux

18 messages 2009/08/31

[ruby-core:25226] Re: Module#prepend and Array#prepend

From: Yehuda Katz <wycats@...>
Date: 2009-08-31 18:12:04 UTC
List: ruby-core #25226
Indeed,
The existing in-ruby solutions only work if the original author takes pains
to supports extensions. In Rails 3, we do this. However, this is a large
burden on Ruby programmers, and we could provide an in-ruby solution
(prepend) that guarantees that any class can be extended.

Consider the following (extremely simplified) scenario:

class ActionController
  def render(template)
    find_template(name).render(self)
  end

  def find_template(name)
    return Template.new(name)
  end
end

Again, this is an extremely simplified example. Now what if I want to add
support for layouts to ActionController? Because render is defined on the
class itself, I cannot do so. As the creator of ActionController, I can do:

module Renderer
  def render(template)
    find_template(name).render(self)
  end

  def find_template(name)
    return Template.new(name)
  end
end

class ActionController
  include Renderer
end

And then to extend, I can do:

module Layouts
  def render(template, layout)
    find_template(layout) { super }
  end
end

class ActionController
  include Layouts
end

Because the original creator of ActionController put the implementation in a
module, another Ruby programmer can extend it. But frequently, Ruby code
does not do this. I would like to be able to do:

module Layouts
  def render(template, layout)
    find_template(layout) { super }
  end
end

class ActionController
  prepend Layouts
end

which would have the same effect as when the implementation was explicitly
inserted into a module, but it'll work on *any* class, not just ones
specially designed.

-- Yehuda
On Mon, Aug 31, 2009 at 9:41 AM, Carl Lerche <clerche@engineyard.com> wrote:

> Yusuke,
>
> The reason that something like #prepend would be needed is so that ruby can
> provide a good way to do AOP. Your example is not exactly a 1-1 mapping onto
> the prepend feature. Instead, you would need to do this:
>
>   module Speak
>>   def speak(words)
>>     puts words
>>   end
>>  end
>>  module Exclaim
>>   def speak(words)
>>     super("#{ words }!")
>>   end
>>  end
>>  class Person # Empty class that only includes the module
>>   include Speak
>>  end
>>  class Exclaimer < Person
>>   include Exclaim
>>  end
>>
>
>
> If your classes are NOT empty and only include modules, then it is
> impossible to include a module "under" methods defined directly on the
> class. This causes pain when you are using a ruby library that does not
> assume that you will be extending classes. Rails "solved" this problem using
> alias_method_chain, but this method can cause confusion.
>
> I hope I explained my thoughts clearly.
>
> Regards,
> Carl Lerche
>
>
> On Aug 31, 2009, at 5:39 AM, Yusuke ENDOH wrote:
>
>  Hi,
>>
>> 2009/8/31 Yehuda Katz <wycats@gmail.com>:
>>
>>> Matz,
>>> As we discussed at LoneStar, I have the following proposal:
>>>
>> (snip)
>>
>>> Effectively, prepend would prepend a module to the class' ancestor chain.
>>>
>>
>>
>> I cannot guess the problem you want to solve.  I know this mail
>> is just discussion log or reminder, but I'd like you to elaborate
>> your proposal completely when sending to ruby-core.
>>
>> Why don't you define subclass explicitly?
>>
>>  class Person
>>   def speak(words)
>>     puts words
>>   end
>>  end
>>  module Exclaim
>>   def speak(words)
>>     super("#{ words }!")
>>   end
>>  end
>>  class Exclaimer < Person
>>   include Exclaim
>>  end
>>  Exclaimer.new.speak("matz") #=> matz!
>>
>> As far as I read your mail, I think this is the correct way.
>>
>> Do you want to define Person by including Exclaimer?  If so,
>> how about this?
>>
>>  class Person
>>   def speak(words)
>>     puts adjust_words(words)
>>   end
>>  end
>>  module Exclaimer
>>   def adjust_words(words)
>>     "#{ words }!"
>>   end
>>  end
>>  class Person
>>   include Exclaimer
>>  end
>>  Person.new.speak("matz") #=> matz!
>>
>> --
>> Yusuke ENDOH <mame@tsg.ne.jp>
>>
>>
>
>


-- 
Yehuda Katz
Developer | Engine Yard
(ph) 718.877.1325

In This Thread