# Basic string iteration

**URL:** https://discourse.julialang.org/t/basic-string-iteration/63081
**Category:** New to Julia
**Created:** [June 17, 2021, 12:23pm UTC](https://discourse.julialang.org/t/basic-string-iteration/63081 "2021-06-17T12:23:28Z")
**Posts on this page:** 7
**Page:** 1

<div class="post-metadata">

### Author: ![alemelis](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/alemelis/32/208433_2.png) [@alemelis](https://discourse.julialang.org/u/alemelis)
#### Post date: [June 17, 2021, 12:23pm UTC](https://discourse.julialang.org/t/basic-string-iteration/63081/1 "2021-06-17T12:23:28Z")

</div>

Hello, I came across this iteration behaviour I don’t really grasp.

I can define a string and iterate through it character-by-character as

```julia
julia> test_string = "abc"
"abc"

julia> for character in test_string
           println(character)
       end
a
b
c

```

but why does the `.|>` notation iterate as the string is indeed an array containing a string?

```julia
julia> test_string .|> character->println(character)
abc

```

---

<div class="post-metadata">

### Author: ![oheil](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oheil/32/220745_2.png) [@oheil](https://discourse.julialang.org/u/oheil)
#### Post date: [June 17, 2021, 12:34pm UTC](https://discourse.julialang.org/t/basic-string-iteration/63081/2 "2021-06-17T12:34:26Z")

</div>

~~Both variants work, because `iterate` is defined for `Strings`.~~  
Wrong. Second variant with `.|>` does not iterate over characters in the `String`.

---

<div class="post-metadata">

### Author: ![alemelis](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/alemelis/32/208433_2.png) [@alemelis](https://discourse.julialang.org/u/alemelis)
#### Post date: [June 17, 2021, 12:37pm UTC](https://discourse.julialang.org/t/basic-string-iteration/63081/3 "2021-06-17T12:37:00Z")

</div>

ok…but why the `.` doesn’t make any difference?

```julia
julia> test_string .|> character->println(character)
abc

julia> test_string |> character->println(character)
abc

```

---

<div class="post-metadata">

### Author: ![oheil](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oheil/32/220745_2.png) [@oheil](https://discourse.julialang.org/u/oheil)
#### Post date: [June 17, 2021, 12:39pm UTC](https://discourse.julialang.org/t/basic-string-iteration/63081/4 "2021-06-17T12:39:04Z")

</div>

Ah, ok, output should be

```julia
a
b
c

```

not  
`abc`  
… have to investigate…

---

<div class="post-metadata">

### Author: ![StefanKarpinski](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stefankarpinski/32/24_2.png) [@StefanKarpinski](https://discourse.julialang.org/u/StefanKarpinski)
#### Post date: [June 17, 2021, 12:46pm UTC](https://discourse.julialang.org/t/basic-string-iteration/63081/5 "2021-06-17T12:46:44Z")

</div>

Strings are scalars for the purposes of broadcasting, so `"abc" .|> x->println(x)` and `"abc" |> x->println(x)` do the same thing and they both call `println` on the entire string a single time. If you want to broadcast over the characters of a string, you need to collect it first: `collect("abc") .|> x->println(x)`. However, this is an antipattern because you are using broadcasting for a side-effect and uselessly constructing a vector of `nothing` values. Consider doing `foreach(println, "abc")` instead. The `foreach` function doesn’t need to guess what is a scalar or not, it only makes sense to apply it to something iterable.

---

<div class="post-metadata">

### Author: ![oheil](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oheil/32/220745_2.png) [@oheil](https://discourse.julialang.org/u/oheil)
#### Post date: [June 17, 2021, 12:48pm UTC](https://discourse.julialang.org/t/basic-string-iteration/63081/6 "2021-06-17T12:48:50Z")

</div>

The REPL docs results in the same:

```julia
help?> .|>
search:

  x .|> y is akin to broadcast(|>, x, y). See broadcast.

```

Therefore we have:

```julia
broadcast(|>, "abc", character->println(character) )

```

which is equivalent to:

```julia
broadcast(|>, "abc", println )

```

which is just

```julia
println("abc")

```

~~It seems I have some kind of error in this argument, but I can’t find it…~~  
I see, this is only stringent, when Strings are scalars in this context, as Stefan pointed out.

---

<div class="post-metadata">

### Author: ![alemelis](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/alemelis/32/208433_2.png) [@alemelis](https://discourse.julialang.org/u/alemelis)
#### Post date: [June 17, 2021, 1:01pm UTC](https://discourse.julialang.org/t/basic-string-iteration/63081/7 "2021-06-17T13:01:33Z")

</div>

I see, thanks you both for the explanation!
