From: Michael Fellinger Date: 2007-01-26T19:47:07+09:00 Subject: Re: some small suggestions to Array On 1/25/07, ������ wrote:> I'm a new user of ruby from China. I love it very much. And I believe> it will become better and better in future. During the study of ruby> these days, I have some small suggestions to ruby.> Please, learn the language a bit more before you already givesuggestions, i know this sounds not very nice and we really appreciateyour suggestions, however, there are some quirks and standards in rubythat you may not be aware of as you write this.This should not mean that you have to be totally proficient in rubyafter a couple of days, it only means that, before you critizisesomething you should have as much knowledge about it as possible. > The suggestions are about the array object, I think we may provide a> much much more flexible way to refer the elements from an array.> Suppose we have an array object [1,2,3,4,5], named "a".> 1.Now we have: a[from, len], The first parameter means the result will> start with a[from], and length is len. Then what about a[2,-3]? I think> a negative second parameter should means an reversed array, that is,> a[2,-3] shoule be [3,2,1]. negative indices count backwards, -1 is the equivalent of 0, but onthe other side of the array.The way to do this right now:a.reverse[2,3]# [3, 2, 1] > Additionally, we may introduce a more flexible way to express the> "end with". maybe like this: a[..2, 3] (means end with a[2], length is> 3, normal direction). here "..2" means end with a[2], and obviously we> should let "2.." means "start with".> Some examples:> a[2.., 3] == a[2,3] -> [3,4,5]> a[2.., -3] == a[2,-3] -> [3,2,1]> a[..2, 3] -> [1,2,3]> a[..2, 3] -> [5,4,3] This again is not possible, ruby ranges require a start and an end(and ruby has no infinite structures) Changing the behavior for Arrayonly is not possible without changing Range, which would require anlanguagewide change for a construct that is quite hard to read. (keepin mind that String and tons of other classes share the behaviour ofArray in this regard) > 2.Now we have: a[2..3] and a[2...3] to discribe a closed interval and a> semi-open interval. I think we should provide an easy way to discrible> any kinds of interval, may be like this:> 2..4 means 2,3,4> [2..4) means 2,3> (2..4] means 3,4> (2..4) means 3> the way above may be not beautiful enough, but the function is> required i guess. no, this again is a request to change Range in a _really_ non-rubyway. If you want a messy way to do such things, use [*] [*(2..4)]# [2, 3, 4][*(2...4)]# [2, 3] > Moreover, I guess a[3..1] should means [4,3,2]. it is just the> semantic of "from..to" Ranges build on the #succ method, the starting-element has to be <=the end-element. > 3.Some much more ideas:> a[i if odd?(i)] should be [2,4]> a[[1,3,3,4]] should be [2,4,4,5]> a[[1,3..4]] should be [2,4,5]> a[:]{|a[i]|, odd?(a[i])} should be [1,3,5], the block works as a> filter of the result. class Symbol def to_proc Proc.new { |*args| args.shift.__send__(self, *args) } endend class Integer; def odd?; self % 2 != 0; end; end a.select(&:odd?)# [1, 3, 5]a.reject(&:odd?)# [2, 4] I won't comment on the other notations since i simply can't graspthem. I am in no way an mathematician, but i am convinced that rubyshould be very simple and easy to understand. Especially constructsthat are used very often. One could however propose to allow negative ranges, at least when thecontent responds to #pred... i think this has been brought forwardquite often, but nobody has done an implementation of it so far.Symbol#to_proc and Integer#odd? will be available with ruby1.9 as faras i am informed... ^ manveru > And what about the combination of all above?> (Some ideas come from the grammar of matlab. Its array's interface> is great.)