It is possible that some of those are outdated — Julia evolves very rapidly. Read the manual.
Iteration (traversal of a collection) is implemented using generic functions in Julia. This means that for each type, you can specify how it is traversed. This has various advantages: some stuctures have a layout which favors a certain kind of traversal, and in some cases, the values can be generated very cheaply on demand, as for
1:10. This is a big advantage compared to R, where
1:10000 means that you actually allocate that vector.
In principle, every function that can expects an iterable object should be able to deal with types that implement the interface.
collect is a workaround for when it is not the case: eg
collect(1:10) converts to a vector
[1,2,3,4,5,6,7,8,9,10]. As a user, design your code so that it works with all iterables (simply not restricting the type will be fine in most cases). If you encounter restrictive behavior in a library, report an issue.