From: bbiker Date: 2007-12-28T06:54:58+09:00 Subject: Re: Add Array#first= and Array#last= to std lib On Dec 27, 2:15 pm, MonkeeSage wrote: > On Dec 27, 12:52 pm, Trans wrote: > > > > > > > On Dec 27, 12:54 pm, MonkeeSage wrote: > > > > On Dec 27, 9:55 am, Sebastian Hungerecker > > > wrote: > > > > > George wrote: > > > > > What would you expect this to do? > > > > > >   [].last = 1 > > > > > The same thing as "[][-1] = 1", I'd imagine. > > > > The problem I'm seeing would be this: If you allow arr.last = x, you'd also > > > > have to allow arr.last(n) = x if you want to be consistent, but that's not > > > > syntactically possible. > > > > > -- > > > > NP: Katatonia - Endtime > > > > Jabber: sep...@jabber.org > > > > ICQ: 205544826 > > > > Agree. It's tempting to treat #first / #last as 0 / -1, but in > > > actuality they are method calls and simply return a value; they don't > > > subscript an array. Setting #last is not semantically different than > > > [1,2,3].pop = 4, it's just that #last is just a bit more subtle. > > > I don't see what you are getting at here. #pop is destructive, #last > > is not. What does #last return when it is called? It returns a > > reference to the last element. So why would #last= do anything other > > then set the reference of the last element? Seems obvious to me. So we > > can't do last(n) = x, due to syntax constraints, oh well. It would > > still be convenient to have the obvious n=1, no arg case. I find that > > my programs are usually easier to read when I can use words rather non- > > alphabetic symbols. > > > T. > > IOW, #pop returns a value, and this is just what #last does. One could > argue that #last and #[-1] *should be* synonymous (which may be the > point of the proposal); but as it currently stands, #last means the > same thing as `def l(a); a[-1]; end` so it makes no sense to have a > setter for it. Unless the semantics change, (to me at least) it is non- > sense to have #last=. It's the same as a.pop = 3. > > Regards, > Jordan- Hide quoted text - > > - Show quoted text - no it is not! irb(main):018:0> p an_array [19, 5, 7, 11, 9, 3] => nil irb(main):019:0> an_array.last => 3 irb(main):020:0> p an_array [19, 5, 7, 11, 9, 3] => nil irb(main):022:0> an_array.pop => 3 irb(main):023:0> p an_array [19, 5, 7, 11, 9] => nil Note that pop actually removes the last item irb(main):025:0* an_array.pop = 3 NoMethodError: undefined method `pop=' for [19, 5, 7, 11, 9]:Array from (irb):25 irb(main):029:0> p an_array [19, 5, 7, 11, 10] => nil irb(main):030:0> an_array[-1] += 1 => 11 irb(main):031:0> p an_array [19, 5, 7, 11, 11] There's is no need for Array#last= or Array#first= since you can simply use an_array[-1] += 1 or an_array[0] += 1