First, Sorry for the late reply.

Without using additional variables and LOCs, I don't see a way for your 
code (even the 1.9 version) to change the nth nil statement as is 
possible with the ArrayValue class.

Dan

Martin DeMello wrote:
> On 12/17/06, Daniel Finnie <danfinnie / optonline.net> wrote:
>>
>> This would allow things like:
>> ary = [4, nil, 6, nil]
>> ary.select{|x| x.nil?}[1].set(2)
>> ary # => [4, nil, 6, 2]
> 
> This will work in 1.8:
> 
> class Array
>  def map_if!(condition)
>    map! {|i| condition.call(i) ? yield i : i}
>  end
> end
> 
> ary.map_if! (lambda {|i| i.nil?) {|x| replacement for x}
> 
> 1.9 allows blocks to take other blocks as arguments, which will (I
> think!) allow something like
> 
> class Array
>  def map_if!(&blk)
>    _map_if(blk)
>  end
> 
>  def _map_if(blk)
>    map! {|i|
>      blk.call(i) ? yield i : i
>    }
>  end
> end
> 
> ary.map_if {|x| x.nil?} {|x| do something with x}
> 
> Seems more generally useful than setting selected elements by index
> (internal versus external iterator)
> 
> martin
> 
>