Ruby each, map, reduce, unless, and until
Tags: ruby, beginners
Published: 2019-11-12 21:10:36

When I started programming I had no idea what enumerables/conditionals were in ruby. Now that I've been coding in ruby for a little while I've used some enumerables/conditionals more than others. In this post, I'll explain some of the enumerables/conditionals you might see as your time as a software engineer.

##.each##
.each is a common method that you might see in other people's code. The .each method goes through all the elements in an array or a hash. Here are some examples of how I would use .each method.

This first example demonstrates how you would use .each for multiple lines.
Example:

```ruby
array = [1, 2, 3]
array.each do |element|
  puts element
end
```
The above will give us 
```ruby
1
2
3
```
Another way to write a .each method is by using {}. Using {} generally means that you are going to put all your logic in one line.
```ruby
array = [1, 2, 3]
array.each { |element| puts element }
```
```ruby
1
2
3
```

Heres an example of using .each with a hash
```ruby
hash = {
  dog: 1,
  cat: 2
}
hash.each do |key, value|
  puts "#{key} #{value}"
end
```
```ruby
dog 1
cat 2
```


##.map##
.map is one of those methods where if you're thinking about using .each think about if you can use .map instead. I know when I was starting to program I would always use .each because I felt comfortable with it. Sometimes it's good to get out your comfort zone.

I mainly use .map for arrays. What .map does is it takes in an array, does some type of logic, and outputs a new array. This is beneficial because you don't have to create a new array variable to store your modified elements. Another great thing about .map is that you won't mutate your original array!
Example:
```ruby
array = [1, 2, 3]
new_array = array.map { |element| element * 2 }
p array
p new_array
```
Above I'm doing a one-line example because we don't too much logic. 
new_array = array.map { |element| element * 2 } goes through my array and multiplies each element by 2 and assigns them to a new array.
```ruby
[1, 2, 3] #original array
[2, 4, 6] #new array
```
.map is definitly one of those methods you will want to know.

##.reduce##
.reduce is another useful method that allows you to accumulate all the numbers in an array and return a single number. There are more use cases for .reduce but I mainly use it when I'm adding a lot of numbers and just want a total.
Example:
```ruby
array = [1, 2, 3, 4, 5]
array.reduce { |sum, n| sum + n }
```
The above is only one of many ways to use/write .reduce. Please refer to [here](https://ruby-doc.org/core-2.4.0/Enumerable.html#method-i-reduce) for more detail on how you can fully utilize this method.
```ruby
15
```
What the .reduce method is doing is taking each element in the array and adding it to sum until we have finished going through our entire array. You can specify what sum is initially but here sum would be our first element, which is 1.

##unless##
These next two conditionals are something I rarely use but is nice to know that I have them if I need them. Unless is the opposite of if.
```ruby
total = 2
if total < 10
  puts "total is less than 10"
end
```
```ruby
total = 2
unless total > 10
  puts "total is less than 10"
end

```
Both puts:
```
total is less than 10
```

##until##
Another conditional I rarely use because is it just the opposite of a while loop. Go do something until this condition is true.
```ruby
total = 2
while total != 5 # while total is not equal to 5
  puts total
  total += 1 #add 1 to total
end
```
```ruby
total = 2
until total == 5 # until total is equal to 5
  puts total
  total += 1 #add 1 to total
end
```
Both puts:
```ruby
2
3
4
```
##Conculsion##
There are many methods and conditional in Ruby or any other language. You don't have to use them all. Familiarize yourself with the most common ones and looks up what you don't remember. Each, Map, and reduce are good to practice. Unless and until aren't needed as much because we have if and while, but you have options available to you.

Thank You for reading! If you have any suggestions or want to point out a mistake I'll try to update accordingly.