1
0
forked from Mirror/wren
Files
wren/doc/site/lists.markdown
Bob Nystrom 58e4d26648 "IO" -> "System".
Get rid of the separate opt-in IO class and replace it with a core
System class.

- Remove wren_io.c, wren_io.h, and io.wren.
- Remove the flags that disable it.
- Remove the overloads for print() with different arity. (It was an
  experiment, but I don't think it's that useful.)
- Remove IO.read(). That will reappear using libuv in the CLI at some
  point.
- Remove IO.time. Doesn't seem to have been used.
- Update all of the tests, docs, etc.

I'm sorry for all the breakage this causes, but I think "System" is a
better name for this class (it makes it natural to add things like
"System.gc()") and frees up "IO" for referring to the CLI's IO module.
2015-09-15 07:46:09 -07:00

3.3 KiB

^title Lists ^category types

A list is a compound object that holds a collection of elements identified by integer index. You can create a list by placing a sequence of comma-separated expressions inside square brackets:

:::dart
[1, "banana", true]

Here, we've created a list of three elements. Notice that the elements don't have to be the same type.

Accessing elements

You can access an element from a list by calling the subscript operator on it with the index of the element you want. Like most languages, indexes start at zero:

:::dart
var hirsute = ["sideburns", "porkchops", "'stache", "goatee"]
hirsute[0] // "sideburns".
hirsute[1] // "porkchops".

Negative indices counts backwards from the end:

:::dart
hirsute[-1] // "goatee".
hirsute[-2] // "'stache".

It's a runtime error to pass an index outside of the bounds of the list. If you don't know what those bounds are, you can find out using count:

:::dart
hirsute.count // 4.

Slices and ranges

Sometimes you want to copy a chunk of elements from a list. You can do that by passing a range to the subscript operator, like so:

:::dart
hirsute[1..2] // ["porkchops", "'stache"].

This returns a new list containing the elements of the original list whose indices are within the given range. Both inclusive and exclusive ranges work and do what you expect.

Negative bounds also work like they do when passing a single number, so to copy a list, you can just do:

:::dart
hirsute[0..-1]

Adding elements

Lists are mutable, meaning their contents can be changed. You can swap out an existing element in the list using the subscript setter:

:::dart
hirsute[1] = "muttonchops"
System.print(hirsute[1]) // muttonchops.

It's an error to set an element that's out of bounds. To grow a list, you can use add to append a single item to the end:

:::dart
hirsute.add("goatee")
System.print(hirsute.count) // 4.

You can insert a new element at a specific position using insert:

:::dart
hirsute.insert(2, "soul patch")

The first argument is the index to insert at, and the second is the value to insert. All elements following the inserted one will be pushed down to make room for it.

It's valid to "insert" after the last element in the list, but only right after it. Like other methods, you can use a negative index to count from the back. Doing so counts back from the size of the list after it's grown by one:

:::dart
var letters = ["a", "b", "c"]
letters.insert(3, "d")   // OK: inserts at end.
System.print(letters)        // ["a", "b", "c", "d"]
letters.insert(-2, "e")  // Counts back from size after insert.
System.print(letters)        // ["a", "b", "c", "e", "d"]

Removing elements

The opposite of insert is removeAt. It removes a single element from a given position in the list. All following items are shifted up to fill in the gap:

:::dart
var letters = ["a", "b", "c", "d"]
letters.removeAt(1)
System.print(letters) // ["a", "c", "d"]

The removeAt method returns the removed item:

:::dart
System.print(letters.removeAt(1)) // "c"

If you want to remove everything from the list, you can clear it:

:::dart
hirsute.clear()
System.print(hirsute) // []