My take on this for list-like structures:

1. Since the potential for hard to track errors is so high - and for
   least surprise - default behavior should always be to throw on
   out-of-bounds access.
2. Returning a default value for out of bound access can be very
   conventient, but should be made explicit; we e.g. use the following
   naming convention in our code in this case:
    1. getWithDefault(index, defaultVal)
        1. We don't need that, but a more general version might be:
           getWithDefault(index, defaultValClosure)
    2. getWithNullDefault(index)
3. Automatically extending the size seems to be the worst option, given
   that one too large index access could easily exhaust a computer's
   main memory (-:

Cheers,
mg

On 06/02/2025 17:27, Milles, Eric (TR Technology) via dev wrote:
Is there any explicit statement about how indexing beyond the end of a collection should work?  Does it extend the collection or just return null.  Does a withDefault collection do something different?

In general, arrays and collections should work the same, so the statement in the working with arrays section is a good one.  In the matter of indexing beyond the end of the array or collection, what is the shared behavior supposed to be:

1.
    return default value for type — aka null for reference and 0/false
    for primitives
2.
    throw out-of-bounds exception
3.
    something else?


------------------------------------------------------------------------
*From:* OCsite <o...@ocs.cz>
*Sent:* Thursday, February 6, 2025 10:11 AM
*To:* dev@groovy.apache.org <dev@groovy.apache.org>
*Subject:* [EXT] Re: a bug or my fault?
*External Email:* Use caution with links and attachments.


The overall intention is that whether you are using an array or a collection, the code for working with the aggregate remains the same <https://urldefense.com/v3/__https://docs.groovy-lang.org/latest/html/documentation/*_working_with_arrays__;Iw!!GFN0sa3rsbfR8OLyAw!ezrONlzs3yG6lC6cFTDF2ASi61brEmoT2ix7QriL2Tg7vhHIhMXTwpPoYFbS77qNBafdycrQlnIZgRDxsA$>.

In this particular case alas that good and noble intention does not quite work, and I wonder whether that is intentional (forgive the pun) or a mistake to be fixed in future, when there's nothing more pressing to do.

    On 6. 2. 2025, at 13:30, Søren Berg Glasius <soe...@glasius.dk> wrote:

    You assign 'b' as an Array, and arrays works differently than
    lists. Arrays are bound to their length, so 'a[2]' should report
    out of bounds as it is not 3 elements long, whereas a list b[2]
    would report null

    IMO it's working as intended.

    Den tors. 6. feb. 2025 kl. 10.20 skrev OCsite <o...@ocs.cz
    <mailto:o...@ocs.cz>>:

        Hi there,

        is this inconsistence intentional and the proper Groovy
        behaviour, or is that a bug and should I add a jira ticket?

        Thanks!

        ===
        *groovy:*000*>* a=[1,2]
        *===>* [1, 2]
        *groovy:*000*>* b=a as Object[]
        *===>* [1, 2]
        *groovy:*000*>* a[2]
        *===>* null
        *groovy:*000*>* b[2]
        *ERROR* java.lang.ArrayIndexOutOfBoundsException:
        *Index 2 out of bounds for length 2*
        *groovy:*000*>*
        ===



    --

    Med venlig hilsen,
    Søren Berg Glasius

    Hedevej 1, Gl. Rye, 8680 Ry
    Mobile: +45 40 44 91 88
    --- Press ESC once to quit - twice to save the changes.


Reply via email to