[#28687] [Bug #2973] rb_bug - Segmentation fault - error.c:213 — rudolf gavlas <redmine@...>

Bug #2973: rb_bug - Segmentation fault - error.c:213

10 messages 2010/03/16

[#28735] [Bug #2982] Ruby tries to link with both openssl and readline — Lucas Nussbaum <redmine@...>

Bug #2982: Ruby tries to link with both openssl and readline

16 messages 2010/03/18

[#28736] [Bug #2983] Ruby (GPLv2 only) tries to link to with readline (now GPLv3) — Lucas Nussbaum <redmine@...>

Bug #2983: Ruby (GPLv2 only) tries to link to with readline (now GPLv3)

10 messages 2010/03/18

[#28907] [Bug #3000] Open SSL Segfaults — Christian Höltje <redmine@...>

Bug #3000: Open SSL Segfaults

19 messages 2010/03/23

[#28924] [Bug #3005] Ruby core dump - [BUG] rb_sys_fail() - errno == 0 — Sebastian YEPES <redmine@...>

Bug #3005: Ruby core dump - [BUG] rb_sys_fail() - errno == 0

10 messages 2010/03/24

[#28954] [Feature #3010] slow require gems in ruby 1.9.1 — Miao Jiang <redmine@...>

Feature #3010: slow require gems in ruby 1.9.1

15 messages 2010/03/24

[#29179] [Bug #3071] Convert rubygems and rdoc to use psych — Aaron Patterson <redmine@...>

Bug #3071: Convert rubygems and rdoc to use psych

10 messages 2010/03/31

[ruby-core:29057] Re: [Feature #889] erb.rb should use Array and << for eoutvar and not String and concat

From: Kurt Stephens <ks@...>
Date: 2010-03-26 23:48:43 UTC
List: ruby-core #29057
Jeremy Kemper wrote:
> On Fri, Mar 26, 2010 at 11:45 AM, Kurt  Stephens <redmine@ruby-lang.org> wrote:
>> Issue #889 has been updated by Kurt  Stephens.
>>
>>
>> This is not a good idea, because the expression value Strings accumulated in the Array must be protected from mutation.
>> ERB expressions can have side-effects.
>>
>> <pre>
>> SOME_STRING = 'foobar'
>> def foo
>>  SOME_STRING
>> end
>> def bar
>>  SOME_STRING.sub!(/bar/, '')
>>  SOME_STRING
>> end
>> # ERB GENERATED CODE: from "<%= foo %><%= bar %>"
>> eoutvar = [ ]
>> eoutvar << foo
>> eoutvar << bar
>> eoutvar.join('')
>> </pre>
> 
> I disagree. That's based on a loose assumption that <%= ... %> behaves
> like #{...}.
> 

String#<<(x) "appends by value", Array#<<(x) "appends by reference". 
The subsequent Array#join is affected by mutations to the argument, the 
former is not.  Ruby Strings are passed and returned by reference, not 
by value.

The proposal introduces aliasing problems that did not exist before.

IMO, it's counter-intuitive.  <%= ... %> currently behaves as if it's 
embedded in a stream, similarly "#{...}" interpolations are evaluated 
left-to-right.  String#<< and IO#<< have stream-like semantics and are 
immune to argument aliasing, Array#<< and the subsequent Array#join 
behave differently.

The example above would work differently, if IO === eoutvar, than if 
Array === eoutvar.  If we don't care about preserving semantics, then 
it's not an issue.

I'd prefer that <%= ... %> continues to behave like "#{...}", both
have implicit order-of-evaluation and are immune to aliasing.

KAS


In This Thread