<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'><div dir='ltr'>
<span class="Apple-style-span" style="font-family: Tahoma; font-size: 14px; ">> > Having a play with this array in the console:<br></span><span class="Apple-style-span" style="font-family: Tahoma; font-size: 14px; ">> > >> x = %w(a b c)</span><div><font class="Apple-style-span" face="Tahoma"><span class="Apple-style-span" style="font-size: 15px;">[...]<br></span></font><font class="Apple-style-span" face="Tahoma" size="2">> All makes sense so far, but when I call x[3,0] I *expect* it to return</font><br><font class="Apple-style-span" face="Tahoma" size="2">> nil (as the starting index is out of range), but it returns an empty</font><br><font class="Apple-style-span" face="Tahoma" size="2">> array:</font><br><font class="Apple-style-span" face="Tahoma" size="2">> >> x[3,0]</font><font class="Apple-style-span" face="Tahoma"><br></font><div style="font-size: 10pt; "><font class="Apple-style-span" face="Tahoma">> => []</font></div><div style="font-size: 10pt; "><font class="Apple-style-span" face="Tahoma"><br></font></div><div style="font-size: 10pt; "><font class="Apple-style-span" face="Tahoma">The key point is that the 3 in a[3] and the 3 in a[3,0] are not referring to the same thing. </font></div><div style="font-size: 10pt; "><font class="Apple-style-span" face="Tahoma"><br></font></div><div><font class="Apple-style-span" face="Tahoma"><font class="Apple-style-span" size="2">a[3] is directly accessing an element within the array. a[3,0] is accessing a portion of the array</font><font class="Apple-style-span" size="2">. This diagram should help (if the formatting makes it through.. copy and paste to fixed-width if it doesn't):</font></font></div><div style="font-size: 10pt; "><font class="Apple-style-span" face="Tahoma"><br></font></div><div style="font-size: 10pt; "><span class="Apple-style-span" style="font-size: 12px; white-space: pre; background-color: rgb(248, 248, 248); "><font class="Apple-style-span" face="Tahoma"><br></font></span></div><div><span class="Apple-style-span" style="white-space: pre; "><font class="Apple-style-span" face="'Courier New'"><div>0   1   2   3</div><div>-------------</div><div>| a | b | c |</div><div>-------------</div><div>  0   1   2</div></font></span></div><div><br></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">Single-integer indexes are at the bottom. They access *elements* of the array.</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">Double-integer indexes are at the top. They access *portions* of the array.</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">You can see that, technically, starting at the top 3 (which a[3,0] does) and counting forwards 0 is still within the array.</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">I think the *reason* Ruby behaves like this for arrays is because it's beneficial for Strings (they share the same underlying code, of course). For example, it's totally valid to access the end portion of a String, which is basically the '' portion just after the final character. If you wanted to insert a character at the end of a string, you could do s[3,0] = 'd'.</font></div><div><br></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">- Will Hamilton</font></div><br><br><div style="font-family: Tahoma; font-size: 10pt; ">> From: chat-request@lists.lrug.org<br>> Subject: Chat Digest, Vol 68, Issue 10<br>> To: chat@lists.lrug.org<br>> Date: Wed, 7 Sep 2011 01:45:49 -0700<br>> <br>> Send Chat mailing list submissions to<br>>    chat@lists.lrug.org<br>> <br>> To subscribe or unsubscribe via the World Wide Web, visit<br>>        http://lists.lrug.org/listinfo.cgi/chat-lrug.org<br>> or, via email, send a message with subject or body 'help' to<br>>       chat-request@lists.lrug.org<br>> <br>> You can reach the person managing the list at<br>>    chat-owner@lists.lrug.org<br>> <br>> When replying, please edit your Subject line so it is more specific<br>> than "Re: Contents of Chat digest..."<br>> <br>> <br>> Today's Topics:<br>> <br>>    1. Re: Ru3y Manor! (Hakan Ensari)<br>>    2. Array.slice question (Michael Pavling)<br>>    3. Re: Array.slice question (Neil Middleton)<br>>    4. Re: Array.slice question (Michael Pavling)<br>>    5. Re: Array.slice question (Neil Middleton)<br>>    6. Re: Array.slice question (Tom Stuart)<br>> <br>> <br>> ----------------------------------------------------------------------<br>> <br>> Message: 1<br>> Date: Tue, 6 Sep 2011 22:07:41 +0100<br>> From: Hakan Ensari <hakan.ensari@papercavalier.com><br>> To: London Ruby Users Group <chat@lists.lrug.org><br>> Subject: Re: [LRUG] Ru3y Manor!<br>> Message-ID: <248F96C4685748D2A83CE4D907A6ACFC@papercavalier.com><br>> Content-Type: text/plain; charset="utf-8"<br>> <br>>  Yes, of course. <br>> <br>> Time is not my forte. Sorry for cluttering the inbox. <br>> <br>> -- <br>> Hakan Ensari<br>> http://hakanensari.com<br>> <br>> On Tuesday, 6 September 2011 at 21:51, Leonardo Cassarani wrote:<br>> <br>> > It's a whole month after the start of RubyConf, actually (September 29th - October 1st).<br>> > <br>> > On 6 September 2011 21:48, Hakan Ensari <hakan.ensari@papercavalier.com (mailto:hakan.ensari@papercavalier.com)> wrote:<br>> > >  Gents, <br>> > > <br>> > > If I'm not mistaken, that's overlapping with RubyConf? <br>> > > <br>> > > -- <br>> > > Hakan Ensari<br>> > > http://hakanensari.com<br>> > > <br>> > > On Tuesday, 6 September 2011 at 10:56, James Adam wrote:<br>> > > <br>> > > > One and all,<br>> > > > <br>> > > > Rejoice! The Guvner will be opening the doors to the Ruby Manor once more:<br>> > > > <br>> > > > http://rubymanor.org/3/<br>> > > > <br>> > > >  Date: Saturday October 29th, 2011[1]<br>> > > > Time: TBC (probably from 10am-6pm)<br>> > > > Location: University of Westminster, New Cavendish Street Campus, London, W1W 6UW[2]<br>> > > > Price: TBC (it'll be in the ballpark of past Manors)<br>> > > > <br>> > > > Like previous Manors (and perhaps in the future, all right-thinking conferences) the community will generate and shape the agenda by proposing talks they're willing to give, and providing suggestions on how to shape the talks they'd like to hear. Unlike previous Manors, they'll be doing it on http://vestibule.rubymanor.org/ instead of the mailing list.<br>> > > > <br>> > > > Vestibule is where you, the attendees, will develop the talks we'll eventually hear in October. It's a simple tool; all you need is a Twitter login and the beginning of an idea and you're set. Vestibule is also open source[3], and we'll be building on it (perhaps with your help?) over the next few weeks. We'll be in touch in a few days explaining the rationale for something beyond a mailing list for discussing talks this year.<br>> > > > <br>> > > > For all peripheral conversation and questions about other parts of the Ruby Manor experience, the mailing list[4] is where it's at, and together with the blog[5] and Twitter accounts[6], it's where you can expect to be kept up to date with what's going on.<br>> > > > <br>> > > > Tickets will go on general sale at the start of October. There'll be about 150 of them, so there should be plenty for everyone. That said, we want to make sure that the people who are the most involved are able to come. Therefore if you contribute to the agenda (or general experience) via Vestibule or the mailing list, we'll make sure there's a ticket with your name on it if you want to buy it. Finally, as with previous Manors, if you propose a talk that is selected you'll get a ticket for free (or a refund if you've already bought one).<br>> > > > <br>> > > > We'll be in touch with more details as we finalize them. In the meantime, feel free to ask any questions and get collaborating on those talk proposals!<br>> > > > <br>> > > > Cheers<br>> > > > <br>> > > > Murray, James, Tom<br>> > > > <br>> > > > [1]: http://lanyrd.com/2011/ru3y-manor/<br>> > > >  [2]: http://osm.org/go/euu4PIcEx-<br>> > > > [3]: http://github.com/h-lame/vestibule<br>> > > > [4]: http://groups.google.com/group/ruby-manor<br>> > > >  [5]: http://blog.rubymanor.org<br>> > > > [6]: http://twitter.com/rubymanor<br>> > > > <br>> > > > _______________________________________________<br>> > > >  Chat mailing list<br>> > > > Chat@lists.lrug.org (mailto:Chat@lists.lrug.org)<br>> > > > http://lists.lrug.org/listinfo.cgi/chat-lrug.org<br>> > > <br>> > > <br>> > > _______________________________________________<br>> > >  Chat mailing list<br>> > > Chat@lists.lrug.org (mailto:Chat@lists.lrug.org)<br>> > > http://lists.lrug.org/listinfo.cgi/chat-lrug.org<br>> > > <br>> > <br>> > _______________________________________________<br>> > Chat mailing list<br>> > Chat@lists.lrug.org (mailto:Chat@lists.lrug.org)<br>> > http://lists.lrug.org/listinfo.cgi/chat-lrug.org<br>> <br>> -------------- next part --------------<br>> An HTML attachment was scrubbed...<br>> URL: <http://lists.lrug.org/pipermail/chat-lrug.org/attachments/20110906/6168517c/attachment-0001.htm><br>> <br>> ------------------------------<br>> <br>> Message: 2<br>> Date: Wed, 7 Sep 2011 09:29:06 +0100<br>> From: Michael Pavling <pavling@gmail.com><br>> To: London Ruby Users Group <chat@lists.lrug.org><br>> Subject: [LRUG] Array.slice question<br>> Message-ID:<br>>     <CA+_7RLwvuzqYVsBh5JdkJXorOK5-CjbJy1D6Z-zG7O90-OBm4A@mail.gmail.com><br>> Content-Type: text/plain; charset=ISO-8859-1<br>> <br>> I'm just running through the Ruby Koans for a bit of fun, and I've<br>> quickly come upon a case that doesn't make sense to me. I've re-read<br>> the documentation, but I still don't understand why it happens.<br>> <br>> Having a play with this array in the console:<br>>   >> x = %w(a b c)<br>>   => ["a", "b", "c"]<br>>   >> x[1]<br>>   => "b"<br>>   >> x[2]<br>>   => "c"<br>>   >> x[3]<br>>   => nil<br>> <br>> All makes sense so far, but when I call x[3,0] I *expect* it to return<br>> nil (as the starting index is out of range), but it returns an empty<br>> array:<br>>   >> x[3,0]<br>>   => []<br>> <br>> x[4,0] behaves as I expected:<br>>   >> x[4,0]<br>>   => nil<br>> <br>> I know it's going to be me not understanding the documentation<br>> properly, but *unless* I can understand it, it's going to leave me<br>> confused. Can anyone explain it simply and clearly, please?<br>> <br>> TIA<br>> <br>> <br>> ------------------------------<br>> <br>> Message: 3<br>> Date: Wed, 7 Sep 2011 09:33:12 +0100<br>> From: Neil Middleton <neil.middleton@gmail.com><br>> To: London Ruby Users Group <chat@lists.lrug.org><br>> Subject: Re: [LRUG] Array.slice question<br>> Message-ID: <BF2EEF4FCB8E4CD7A09E9E3B03A68521@gmail.com><br>> Content-Type: text/plain; charset="utf-8"<br>> <br>> You're asking for no length with [3,0] hence it slicing at position 3 for 0 chars. With the second version you're using an out of range start position hence the nil.<br>> <br>> N <br>> <br>> Neil<br>> <br>> On Wednesday, 7 September 2011 at 09:29, Michael Pavling wrote:<br>> <br>> > I'm just running through the Ruby Koans for a bit of fun, and I've<br>> > quickly come upon a case that doesn't make sense to me. I've re-read<br>> > the documentation, but I still don't understand why it happens.<br>> > <br>> > Having a play with this array in the console:<br>> > >> x = %w(a b c)<br>> >  => ["a", "b", "c"]<br>> > >> x[1]<br>> >  => "b"<br>> > >> x[2]<br>> >  => "c"<br>> > >> x[3]<br>> >  => nil<br>> > <br>> > All makes sense so far, but when I call x[3,0] I *expect* it to return<br>> > nil (as the starting index is out of range), but it returns an empty<br>> > array:<br>> > >> x[3,0]<br>> >  => []<br>> > <br>> > x[4,0] behaves as I expected:<br>> > >> x[4,0]<br>> >  => nil<br>> > <br>> > I know it's going to be me not understanding the documentation<br>> > properly, but *unless* I can understand it, it's going to leave me<br>> > confused. Can anyone explain it simply and clearly, please?<br>> > <br>> > TIA<br>> > _______________________________________________<br>> > Chat mailing list<br>> > Chat@lists.lrug.org (mailto:Chat@lists.lrug.org)<br>> > http://lists.lrug.org/listinfo.cgi/chat-lrug.org<br>> <br>> -------------- next part --------------<br>> An HTML attachment was scrubbed...<br>> URL: <http://lists.lrug.org/pipermail/chat-lrug.org/attachments/20110907/8c77aa33/attachment-0001.htm><br>> <br>> ------------------------------<br>> <br>> Message: 4<br>> Date: Wed, 7 Sep 2011 09:34:56 +0100<br>> From: Michael Pavling <pavling@gmail.com><br>> To: London Ruby Users Group <chat@lists.lrug.org><br>> Subject: Re: [LRUG] Array.slice question<br>> Message-ID:<br>>       <CA+_7RLyL+eCbOVxH5Yzp-M5NY-Cqcphkp17fHzXx7tmXwDqXZA@mail.gmail.com><br>> Content-Type: text/plain; charset=ISO-8859-1<br>> <br>> On 7 September 2011 09:33, Neil Middleton <neil.middleton@gmail.com> wrote:<br>> > You're asking for no length with [3,0] hence it slicing at position 3 for 0<br>> > chars. ?With the second version you're using an out of range start position<br>> > hence the nil.<br>> <br>> But if x[3] is nil (because it's out of range), how come starting the<br>> slice at 3 doesn't count as out of range too?:-/<br>> <br>> <br>> ------------------------------<br>> <br>> Message: 5<br>> Date: Wed, 7 Sep 2011 09:40:02 +0100<br>> From: Neil Middleton <neil.middleton@gmail.com><br>> To: London Ruby Users Group <chat@lists.lrug.org><br>> Subject: Re: [LRUG] Array.slice question<br>> Message-ID: <08528E5D18534115A92C89134FC69262@gmail.com><br>> Content-Type: text/plain; charset="utf-8"<br>> <br>>  Ah yes, see what you mean. Good question ;) <br>> <br>> Neil<br>> <br>> On Wednesday, 7 September 2011 at 09:34, Michael Pavling wrote:<br>> <br>> > On 7 September 2011 09:33, Neil Middleton <neil.middleton@gmail.com (mailto:neil.middleton@gmail.com)> wrote:<br>> > > You're asking for no length with [3,0] hence it slicing at position 3 for 0<br>> > > chars. With the second version you're using an out of range start position<br>> > > hence the nil.<br>> > <br>> > But if x[3] is nil (because it's out of range), how come starting the<br>> > slice at 3 doesn't count as out of range too?:-/<br>> > _______________________________________________<br>> > Chat mailing list<br>> > Chat@lists.lrug.org (mailto:Chat@lists.lrug.org)<br>> > http://lists.lrug.org/listinfo.cgi/chat-lrug.org<br>> <br>> -------------- next part --------------<br>> An HTML attachment was scrubbed...<br>> URL: <http://lists.lrug.org/pipermail/chat-lrug.org/attachments/20110907/47bc435e/attachment-0001.htm><br>> <br>> ------------------------------<br>> <br>> Message: 6<br>> Date: Wed, 7 Sep 2011 09:45:49 +0100<br>> From: Tom Stuart <tom@experthuman.com><br>> To: London Ruby Users Group <chat@lists.lrug.org><br>> Subject: Re: [LRUG] Array.slice question<br>> Message-ID: <AEF128E4-AE4B-4812-8F30-2D954A8551C3@experthuman.com><br>> Content-Type: text/plain; charset=us-ascii<br>> <br>> On 7 Sep 2011, at 09:29, Michael Pavling wrote:<br>> > when I call x[3,0] I *expect* it to return<br>> > nil (as the starting index is out of range), but it returns an empty<br>> > array:<br>> >>> x[3,0]<br>> >  => []<br>> <br>> Not really an explanation, but this is just how rb_ary_subseq works[1]. It's noted as a special case in the Array#slice documentation[2].<br>> <br>> Cheers,<br>> -Tom<br>> <br>> [1] https://github.com/ruby/ruby/blob/trunk/array.c#L952<br>> [2] http://ruby-doc.org/core/classes/Array.html#M000267<br>> <br>> ------------------------------<br>> <br>> _______________________________________________<br>> Chat mailing list<br>> Chat@lists.lrug.org<br>> http://lists.lrug.org/listinfo.cgi/chat-lrug.org<br>> <br>> <br>> End of Chat Digest, Vol 68, Issue 10<br>> ************************************<br></div></div>                                        </div></body>
</html>