This document should be used as a quick reference for Ruby; for more depth, click through to the “Full Explanation”s.
This reference is (with a few exceptions) organized by Ruby Class, e.g. String
, Array
, Hash
, etc. Click the firstdraft icon in the top-left corner of the page to slide out the table of contents, scan it, and find a section that interests you. Usually, each section describes a Ruby method. For example, here’s what the section String#split
looks like:
String#split => Array
is called the method signature:
String
since the method is defined for that class.#
since it is an instance method (as opposed to a class method, in which case the notation would be .
).=> Array
since the return value of this method is an instance of the class Array
.Please let us know if you find errors, omissions, or have any other suggestions or comments. Thank you!
ActiveRecord_Relation
s inherit from Array
, so all Array
methods work:
.each
.at()
(and its aliases []
, .first
for .at(0)
, .last
for .at(-1)
).count
.reverse
.sample
.shuffle
ActiveRecord_Relation#where(Hash) ⇒ ActiveRecord_Relation
Call .where
on an ActiveRecord_Relation
to filter the array of records based on some criteria.
where
returns an ActiveRecord_Relation
based on the given Hash
.
.where
returns an ActiveRecord_Relation
regardless of how many results there are. In particular, even if there is only one result, the return value will still be another ActiveRecord_Relation
.
The argument to .where
is usually a Hash
:
Filtering by an exact match within a column:
{ :id => 42 }
Filter by multiple columns at once:
{ :photo_id => 23, :user_id => 42 }
Filter using an Array
(results will match any of the values in the Array
):
{ :owner_id => [4, 8, 15 ] }
Filtering within a range of values:
{ :dob => (1.year.ago..Date.today) }
{ :last_name => ("A".."C") }
If you really want to, you can omit the curly brackets around the Hash
for brevity, and Ruby will figure out what you mean. So, ultimately, you can write something like this:
Contact.where(:last_name => ("A".."C"))
instead of this:
Contact.where({ :last_name => ("A".."C") })
Related Methods: .where.not
, .or
, .limit
, .order
ActiveRecord_Relation#where.not(Hash) ⇒ ActiveRecord_Relation
Call .where.not
on an ActiveRecord_Relation
to filter the array of records to exclude records based on the given Hash
. .where.not
will return an ActiveRecord_Relation
.
Contact.where({ :last_name => "Mouse" }).where.not({ :first_name => "Mickey" })
ActiveRecord_Relation
..not
are the same as to .where
; see that method for a list.Related methods: .where
, .order
, .limit
ActiveRecord_Relation#or(ActiveRecord_Relation) ⇒ ActiveRecord_Relation
Call .or
on an ActiveRecord_Relation
to combine the array of records with another array of records:
ActiveRecord_Relation
..or
must be another ActiveRecord_Relation
from the same table.Contact.where({ :first_name => "Mickey" }).or(Contact.where({ :last_name => "Betina" }))
ActiveRecord_Relation#order(Hash) ⇒ ActiveRecord_Relation
or
ActiveRecord_Relation.order(Symbol) ⇒ ActiveRecord_Relation
Call .order
on an ActiveRecord_Relation
to sort the array based on one or more columns. This method returns an ActiveRecord_Relation
.
Contact.all.order({ :last_name => :asc, :first_name => :asc, :date_of_birth => :desc })
Returns an ActiveRecord_Relation
.
The argument to .order
is usually a Hash
.
Hash
must be Symbol
s that match names of columns in the table. These are the columns that will be used for sorting. If there are multiple keys, the order in which they are provided will be used to break ties.:asc
(for ascending order) or :desc
(for descending order).The argument to .order
can also just be one Symbol
, a column name.
Contact.all.order(:last_name)
In that case, :asc
order is assumed.
ActiveRecord_Relation#limit(Integer) ⇒ ActiveRecord_Relation
Call .limit
on an ActiveRecord_Relation
to cap the number of records in the array.
ActiveRecord_Relation
..limit
must be an Integer
.Contact.where({ :last_name => "Mouse" }).limit(10)
ActiveRecord_Relation#offset(Integer) ⇒ ActiveRecord_Relation
Call .offset
on an ActiveRecord_Relation
to discard the first few records in the array:
ActiveRecord_Relation
..offset
must be an Integer
.Contact.where({ :last_name => "Mouse" }).offset(10).limit(10)
ActiveRecord_Relation#map_relation_to_array(Symbol) ⇒ Array
Call .map_relation_to_array
on an ActiveRecord_Relation
to retrieve the values stored in just one column of the records, and discard all other data.
.map_relation_to_array
returns a regular Ruby Array
of scalar values in the column.
ActiveRecord_Relation
.ActiveRecord_Relation
, so you can no longer use methods like .where
, .order
, etc. You can use Array
methods like .sort
, .sample
, etc.The argument to .map_relation_to_array
must be a Symbol
that matches the name of a column in the table.
You cannot call .map_relation_to_array
on an individual ActiveRecord row. If you want the value in a column for an individual row, simply call the accessor method directly:
Contact.all.map_relation_to_array(:last_name) # => ["Betina", "Mouse", "Woods"]
# for an array of records
people.last_name # undefined method for array; bad
people.map_relation_to_array(:last_name) # => ["Betina", "Woods"]; good
ActiveRecord_Relation#maximum(Symbol) ⇒ Object
Call .maximum
on an ActiveRecord_Relation
to grab and return the biggest value of a particular column.
User.all.maximun(:age)
# => 102
ActiveRecord
column.ActiveRecord_Relation#minimum(Symbol) ⇒ Object
Call .minimum
on an ActiveRecord_Relation
to grab and return the smallest value of a particular column.
Photo.all.minimum(:caption)
# => "... a mind needs books as a sword needs a whetstone, if it is to keep its edge."
ActiveRecord
column.ActiveRecord_Relation#sum(Symbol) ⇒ Integer
or ⇒ Float
or ⇒ String
Call .sum
on an ActiveRecord_Relation
to find the sum of the values in a single column:
@poem.scores.sum(:points)
Integer
or Float
(or even a String
), depending on datatype of the column that was summed..sum
must be a Symbol
that matches the name of a column in the table.ActiveRecord_Relation#average(Symbol) ⇒ Integer
or ⇒ Float
Call .average
on an ActiveRecord_Relation
to find the mean of the values in a single column:
@restaurant.reviews.average(:rating)
Integer
or Float
, depending on datatype of the column that was averaged..average
must be a Symbol
that matches the name of a column in the table.ActiveRecord
(A single record)You get a method for every column in the table; for example, if you have retrieved an individual record from the Contact
table, you can call .first_name
, .last_name
, etc, on it.
This means that every ActiveRecord
object will have methods .id
, .created_at
, and .updated_at
, since every table has those columns.
It’s often helpful to define your own instance methods in the model file; for example, you might want to define a method .full_name
:
class Contact < ApplicationRecord
def full_name
return self.first_name + " " + self.last_name
end
end
You would then be able to call .full_name
anywhere in the application that you wind up with an individual Contact
object.
belongs_to(Symbol, Hash) ⇒ ActiveRecord
Let’s say I have a movie in a variable m
. It is annoying and error prone to, whenever I want the director associated with a movie, have to type
d = Director.where({ :id => m.director_id }).at(0)
Wouldn’t it be great if I could just type
d = m.director
and it would know how to go look up the corresponding row in the directors table based on the movie’s director_id
?
Unfortunately, I can’t, because .director
isn’t a method that Movie
objects automatically know how to perform — the method would be undefined. (Movie
objects know how to perform .director_id
because we get a method for every column in the table.)
We could define such an instance method in the model ourselves without too much trouble. But, fortunately, since domain modeling and associations are at the heart of every application’s power, Rails gives us a shortcut. Go into the Movie
model and add a line like this:
belongs_to(:director, { :class_name => "Director", :foreign_key => "director_id" })
This line tells Rails:
belongs_to
: We only one result (not an array of results).:director
: Define a method called .director
for all movie objects.:class_name => "Director"
: When someone invokes .director
on a movie, go fetch a result from the directors table.:foreign_key => "director_id"
: Use the value in the director_id
column of the movie to query the directors table for a row.This is exactly what we would do if we defined the instance method by hand:
def director
return Director.where({ :id => m.director_id }).at(0)
end
Either way, we now can utilize this handy shortcut anywhere in our application when we have a movie m
and we want to get the record in the directors table associated with it:
m.director
Even better, if you’ve named your method and foreign key column conventionally (exactly matching the name of the other table), you can use the super-shorthand version:
belongs_to(:director)
If you omit specifying the :class_name
, Rails assumes that the table that you want to query is named the same thing as the method you are defining.
If you omit specifying the :foreign_key
, Rails assumes that the foreign key column is named the same thing as the method plus _id
.
If either of those things happens to not be true, then just include the Hash
as the second argument to belongs_to
and spell it all out:
belongs_to(:owner, { :class_name => "User", :foreign_key => "poster_id" })
This would give us a method called .owner
that returns a User
, even though the foreign key column is called poster_id
. We still have complete control, if we need to depart from conventional method/foreign key names for some reason.
has_many(Symbol, Hash) ⇒ ActiveRecord_Relation
Let’s say I have a director in a variable d
. It is annoying and error prone to, whenever I want the films associated with the director, have to type
f = Movie.where({ :director_id => d.id })
Wouldn’t it be great if I could just type
f = d.movies
and it would know how to go look up the corresponding rows in the movies table based on the director’s id
?
Unfortunately, I can’t, because .movies
isn’t a method that Director
objects automatically know how to perform — the method would be undefined.
We could define such an instance method in the model ourselves without too much trouble. But, fortunately, since domain modeling and associations are at the heart of every application’s power, Rails gives us a shortcut. Go into the Director
model and add a line like this:
has_many(:movies, { :class_name => "Movie", :foreign_key => "director_id" })
This line tells Rails:
has_many
: We want many results in an array.:movies
: Define a method called .movies
for all director objects.:class_name => "Movie"
: When someone invokes .movies
on a director, go fetch results from the movies table.:foreign_key => "director_id"
: Use the director_id
column of the movies table to filter using the id
of the director.This is exactly what we would do if we defined the instance method by hand:
def movies
return Movie.where({ :director_id => self.id })
end
Either way, we now can utilize this handy shortcut anywhere in our application when we have a director d
and we want to get the records in the movies table associated with it:
d.movies
Even better, if you’ve named your method and foreign key column conventionally (exactly matching the name of the other table), you can use the super-shorthand version:
has_many(:movies)
If you omit specifying the :class_name
, Rails assumes that the table that you want to query is named the same thing as the method you are defining.
If you omit specifying the :foreign_key
, Rails assumes that the foreign key column is named the same thing as this model plus _id
.
If either of those things happens to not be true, then just include the Hash
as the second argument to belongs_to
and spell it all out:
has_many(:filmography, { :class_name => "Movie", :foreign_key => "director_id" })
This would give us a method called .filmography
that returns Movie
s. We still have complete control, if we need to depart from conventional method/foreign key names for some reason.
has_many(Symbol, Hash) ⇒ ActiveRecord_Relation
After you have established all of your one-to-many association helper methods, you can also add many-to-many helper methods with the :through
option on has_many
:
class Movie < ApplicationRecord
has_many(:characters)
has_many(:actors, { :through => :characters, :source => :actor })
end
class Character < ApplicationRecord
belongs_to(:movie)
belongs_to(:actor)
end
class Actor < ApplicationRecord
has_many(:characters)
has_many(:movies, { :through => :characters, :source => :movie })
end
String#concat(Integer) ⇒ String
or
String#concat(String) ⇒ String
Appends the given arguments to a string. when given an integer as an argument, it converts the integer into ASCII code.
"hi".concat(33) # => "hi!"
"Rub".concat(121) # => "Ruby"
When given a string literal as an argument, it adds that string to the original string. .+
or +
is similar to the .concat
method. +
will return a new combined String
instead of modifying the original String
. Each line of code below will give the same output.
"hi".concat(" there")
"hi".+(" there")
"hi" +(" there")
"hi" + " there"
This method returns a new String
Multiplies the original string by the given integer and returns the new modified String
.
"Ya" * 5
Returns "YaYaYaYaYa"
"Ya" * 0
Returns ""
String#upcase ⇒ String
Converts all lowercase letters to their uppercase counterparts in the given string and returns the new modified String
.
"hello".upcase`
Returns
"HELLO"
String#downcase ⇒ String
Converts all the uppercase letters to their lowercase counterparts from the given String
. Returns the new modified String
.
"HI".downcase`
Returns
"hi"
String#swapcase ⇒ String
Converts all the uppercase letters to their lowercase counterparts and lowercase letters to their uppercase counterparts from the given string. Returns the new modified String
.
"Hi There".swapcase
Returns
"hI tHERE"
"hI tHERE".swapcase
Returns
"Hi There"
String#reverse ⇒ String
Returns a new String
with the characters from the original String in reverse order.
"stressed".reverse
Returns
"desserts"
String#length ⇒ Integer
Returns the Integer
number of charactersin the String
.
"hippopotamus".length
Returns
12
String#chomp ⇒ String
or
String#chomp(String) ⇒ String
When not given any argument, removes the "\n"
(newline) character from the end of the string. When given an argument of a charcter or a string, it remove that argument from the end of the orginal string.
Returns a new String
with the character removed.
"Hey!\n".chomp
"Hey!".chomp("!")
"Hey There".chomp("There")
"Hey!".chomp("y")
"Hey!"
"Hey"
"Hey "
"Hey!"
p "What is your name?"
name = gets # supposes the user inputs "Clark" and then hits return
p "Hi" + name
Prints
"Hi Clark\n"
p "What is your name?"
name = gets # supposes the user inputs "Clark" and then hits return
p "Hi" + name.chomp
Prints
"Hi Clark"
p "What is your name?"
name = gets.chomp # supposes the user inputs "Clark" and then hits return
p "Hi" + name
"Hi Clark"
String#gsub(String, String) ⇒ String
Substitutes the all occurances of the first argument with the second argument in original string and returns a new String
with the substitutes made.
"Hello".gsub("ello", "i")
Returns
"Hi"
"Hi.there".gsub(".", " ")
Returns
"Hi there"
Giving an empty string as the second arugment deletes any occurences of the first arugument in the string.
"example @ ruby.com".gsub(" ", "")
Returns
"example@ruby.com"
String#to_i ⇒ Integer
Converts a string literal that contains a number to an integer. The Integer
is returned.
"8".to_i
Returns
8
p "What is your lucky number?"
lucky_number = gets.chomp # Suppose the user types is "7" and then hits return
square = lucky_number ** 2 # This will throw an error.
Returns
NoMethodError (undefined method '**' for "7":String)
This is where the .to_s
method comes handy.
p "What is your lucky number?"
lucky_number = gets.chomp # Suppose the user types is "7" and then hits return
square = lucky_numbe.to_i ** 2 # This will throw an error.
p square
Returns
"49"
String#strip ⇒ String
Removes all leading and trailing whitespace in the string.
Returns a new String
that has been modified from the original.
" hi there ".strip
Returns
"hi there"
String#capitalize ⇒ String
Capitalizes the first character of a string.
Returns a new String
that has been modified from the original.
"capitalize".capitalize
Returns
"Capitalize"
String#split ⇒ Array
or
String#split(String) ⇒ Array
Splits a string into an substrings and creates an Array of these substrings. when not given argument, .split
uses whitespace to divide the string. when given an argument, .split
divides the string on that argument.
Returns an Array
of the divided String
.
"Hello hi byebye".split
Returns
["Hello", "hi", "byebye"]
"one!two!three!".split("!")
Returns
["one", "two", "three"]
String#include?(String) ⇒ Boolean
Returns a boolean(true
or false
) based on whether the string argument is inside the string the method is being called on.
"Happy".include?("H")
Returns
true
"Happy".include?("Z")
Returns
false
whole numbers
12 + 5 # => 17
12 - 5 # => 7
12 * 5 # => 60
12 / 5 # => 2
The /
operator for integers only returns a whole number and omits the remainder.
%
(modulus) operatorInteger % Integer ⇒ Integer
Returns the Integer
remainder from a divisions.
13 / 5
Returns
3
**
operator IntegerInteger ** Integer ⇒ Integer
Raises a number to a power.
Returns an Integer
3 ** 2 # => 9
2 ** 3 # => 8
Integer#odd? ⇒ Boolean
or
Integer#even? ⇒ Boolean
Returns a boolean(true
or false
) based on whether the integer is odd or even.
7.odd?
Returns
true
8.odd?
Returns
false
8.even?
Returns
true
7.even?
Returns
false
Integer#rand ⇒ Float
or
Integer#rand(Integer) ⇒ Integer
or
Integer#rand(Range) ⇒ Integer
Float
between 0 to 1Integer
argument that will generate and return an Integer
between 0 and the argument.Range
that will generate a random Integer
that between the Range
.rand # returns => 0.21374618638...
rand(10) # returns => 7
rand((10..20)) # returns => 19
Integer#to_s ⇒ String
Converts an integer to a string literal.
Returns a String
8.to_s
“8”
lucky_number = rand(10) # assigns a random integer between 0 to 9 to the variable lucky_number
p "My lucky number is " + lucky_number + "!"
The above block of code won’t work and will throw an error.
TypeError (no implicit conversion of Integer into String)
This is where the .to_s
method comes handy.
lucky_number = rand(10) # assigns a random integer between 0 to 9 to the variable lucky_number
p "My lucky number is " + lucky_number.to_s + "!"
“My lucky number is 7!”
"There are " + 7.to_s + " pineapples."
“There are 7 pineapples”
Integer#to_f ⇒ Float
converts an integer to a Float
(decimal).
7.to_f
7.0
number = 10 #
p number / 3 # Returns => 3
p number.to_f / 3 # Returns => 3.3333333333333335
decimals
Standard operations are similar to those for the Integer class. The only exception is the /
operator which returns fractional results.
12 / 5 # => 2
12.0 / 5.0 # => 2.4
12 / 5.0 # => 2.4
12.0 / 5 # => 2.`
**
Float operatorFloat ** Float ⇒ Float
The **
operator for Floats can additionally be used to calculate roots.
9 ** 0.5 # => 3.0, since 9^(1/2) = sqaureroot of 9
8 ** (1/3.0) # => 2.0, since 8^(1/3) = cuberoot of 8
Float#round ⇒ Integer
or
Float#round(Integer) ⇒ Float
Integer
) of a decimal when not given any argument.Float
rounded to the number of decimal places specified by the argument.3.14159.round # => 3
3.14159.round(3) # => 3.142
3.14139.round(3) # => 3.141
Float#to_i ⇒ Integer
Converts a float to an integer by rounding the float down to closest whole number.
Returns an Integer
"8.9".to_i
8
"8.1".to_i
8
12 / 5 # => 2
(12 / 5).to_f # => 2.0
12.to_f / 5 # => 2.4
12 / 5.to_f # => 2.4
(12.0 / 5 ).to_i # => 2
(12 / 5.0).to_i # => 2
To use the Date class in a Ruby program, we need to say:
require "date"
Note:
Only Ruby programs need to have a require
statement for the Date class. Rails already does this for you.
Date.new ⇒ Date
Use the .new
method to create a new instance of a Date object. The .new
method can be used with or without argument. When given no arguments, the default date is set to Jan 1st, -4712 BCE.
Date.new # => #<Date: -4712-01-01 ((0j,0s,0n),+0s,2299161j)>
Date.new(2001) # => #<Date: 2001-01-01 ...>
Date.new(2001,2,3) # => #<Date: 2001-02-03 ...>
Date.new(2001,2,-1) # => #<Date: 2001-02-28 ...>
Date.today ⇒ Date
Initializes a Date object to the current date.
Returns a Date
Date.today # => #<Date: 2019-04-16 ((2458590j,0s,0n),+0s,2299161j)>
Date.parse(String) ⇒ Date
Returns a Date
object initialized to a date, interpreted from the given String argument.
Date.parse("2001-02-03") # => #<Date: 2001-02-03 ...>
Date.parse("20010203") # => #<Date: 2001-02-03 ...>
Date.parse("3rd Feb 2001") # => #<Date: 2001-02-03 ...>
Two dates can be subtracted from one another. The -
operator returns a Rational
which can be converted into an Integer
to find the days in between the two dates.
number_of_days = Date.today - Date.parse("July 4, 1776")
# => number_of_days = (88674/1)
number_of_days.to_i # => 88674
Date.mday ⇒ Integer
Returns the day of the month (1-31).
held_on = Date.new(2001,2,3)
held_on.mday # => 3
Date.wday ⇒ Integer
Returns the day of the week as an Integer
(0-6, Sunday is 0).
held_on = Date.new(2001,2,3)
held_on.wday # => 6
Date#moday? ⇒ Boolean
date = Date.new
date.monday? # => true if date is a Monday.
date.tuesday? # => true if date is a Tuesday.
date.wednesday? # => true if date is a Wednesday.
date.thursday? # => true if date is a Thursday.
date.friday? # => true if date is a Friday.
date.saturday? # => true if date is a Saturday.
date.sunday? # => true if date is a Sunday.
Returns a Boolean
, true
or false
, if this given Date
is a particular day of the week.
list of objects represented with square brackets, [].
Array.new ⇒ Array
initializes a new empty Array.
cities = Array.new # => cities = []
or
cities = [] # => cities = []
Array#push(Object) ⇒ Array
Adds elements to the end of an Array. Returns the modified Array
.
cities.push("Chicago")
cities.push("Los Angeles")
cities.push("New York City")
or
cities = ["Chicago", "Los Angeles", "New York City"]
# Initializes and adds elements to an Array
Array#.at(Integer) ⇒ Object
Takes an Integer argument and return the element in that position of an Array. The following lines of code show the various forms of the .at
method and return the same output.
Returns an Object
cities = ["Chicago", "Los Angeles", "New York City"]
cities.at(2)
cities.[](2)
cities[2]
"New York City"
Note:
nil
.cities.at(3) # => nil
cities.at(-1) # => "New York City"
cities.at(-2) # => "Los Angeles"
cities.at(-3) # => "Chicago"
cities.at(-4) # => nil
Array#first ⇒ Object
or Array#last ⇒ Object
Retrieves and returns the first or the last element of an array.
Returns an Object
cities.first # => "Chicago"
cities.last) # => "New York City"
Array#index(Object) ⇒ Integer
Returns an Integer
that is the index of an element.
cities.index("Los Angeles") # => 1
Array#count ⇒ Integer
or Array#count(Object) ⇒ Integer
Returns the number of elements in a list, when give no arguments. If given an argument, returns the number of times that arguments occurs in the array. In both instances, this method returns an Integer
nums = [8, 3, 1, 19, 23, 3]
nums.count # => 6
nums.count(3) # => 2
nums.count(2) # => 0
Array#reverse ⇒ Array
Returns a new Array
Array with the elements of the original Array but in the reversed order.
nums.reverse # => [3, 23, 19, 1, 3, 8]
Array#.sort ⇒ Array
Returns a new Array
with the elements of the original Array but in the sorted in increasing order.
nums.sort # => [1, 3, 3, 8, 19, 23]
nums = [8, 3, 1, 19, 23, 3]
nums.sort # => [1, 3, 3, 8, 19, 23]
nums.reverse # => [3, 23, 19, 1, 3, 8]
nums.sort.reverse # => [23, 19, 8, 3, 3, 1], first sorts then reverses the Array.
Array#shuffle ⇒ Array
Returns a new Array
with the elements of the original Array but with the order shuffled randomly.
nums.shuffle # => [3, 23, 8, 19, 1, 3]
nums.shuffle # => [19, 3, 1, 8, 3, 23]
Array#sample ⇒ Array
Returns a random element from the array.
nums.sample # => 23
nums.sample # => 3
Array#min ⇒ Object
or Array#max ⇒ Object
Retrieve the elements of minimum and the maximum values in the array.
nums.min # => 1
nums.max # => 23
Array#sum
Returns the sum of all the elements in the array.
nums.sum # => 57
Note This method only works in the elements in the Array
are not a Hash
list of objects represented with curly brackets, {}. Unlike Arrays, each cell is not automatically numbered but given a label by us.
Symbols are a sequence of characters and are used to to label something internally in the code. They are created by starting them off with a colon and follow the same naming conventions as variables, :hello
.
:hello.class # => Symbol
Hash.new ⇒ Hash
person1 = Hash.new
or
person2 = {}
Hash#store(Object, Object) ⇒ Object
Adds elements to a Hash by taking two arguments, a label (or key) and a piece of data (or value).
This method returns the Object
that was stored.
The key
can be any type, although is usually a Symbol
. The value can also be of any type.
person1.store(:first_name, "Raghu")
person1.store(:last_name, "Betina")
person1.store(:role, "Instructor")
# => person1 = {:first_name=>"Raghu", :last_name=>"Betina", :role=>"Instructor"}
or we can fill up a hash by typing in the hash literal
person2 = { :first_name => "Jocelyn", :last_name => "Williams", :role => "Student" }
Note:
=>
, known as a “hash rocket.”.store
something under it, its value will be replaced.Hash#fetch(Object) ⇒ Object
or
Hash#fetch(Object, Object) ⇒ Object
Both .fetch
and .[]
can be used to retrieves the data held by a key.
person1.fetch(:last_name)# => "Betina"
person2.[:last_name] # => "Williams"
If .fetch
is given key that is not present in the hash, it will throw an error. But .[]
is given key that is not present in the hash, it returns nil
.
Fallback: pass in a second default argument that .fetch
will return if the key is not present in the hash.
person1.fetch(:middle_name, "None provided") # => "None provided"
Basic Anatomy of multibranch if
statements:
if condition1
# do something if condition1 is true
elsif condition2
# do something if condition2 is true
else # if both condition1 and condition2 were falsy
# do something else
end
Example:
p "Type a number less than 10 and greater than 0:"
user_input = gets.chomp.to_i # gets user input, removes newline character, converts the string to integer.
if user_input == 5
p "You win!" # Will print this if the user input is 5
elsif user_input < 10 && user_input > 0 # check if the user input is valid
p "You lose!" # Will print this if the user input is between 1 and 9
else
p "You didn't type in a valid number." # Will print this if the user input is not between 1 and 9
end
Don’t forget the end
keyword.
while statements:
while boolean
# ruby code here
end
⇒ nil
while
is similar to if
. The difference is everytime the execution of the program reaches the end
it jumps back and evaluates the truthiness of the condtion next to the while
statement and decides whether or not to execute the code within the while
loop.
while condition
# do something while condition is true
end # jump back to the while statement
Example:
limit = 5
while limit > 0
p limit
limit = limit - 1
end
5
4
3
2
1
Note:
If the condition next to the while
always evaluates to be “truthy,” then the program will be stuck in a neverending loop, infamously known as an
infinite loop.
Integer#times do
# ruby code here
end
⇒ Integer
or
Integer#times do |Integer|
# ruby code here
end
⇒ Integer
The .times
method takes a Block
as an argument and will execute the code within that block the number of times specified by the integer. A Block
of code is the code written in between the keywords do
and end
. This looping method returns an Integer
of the number of times the loop ran.
10.times do
p "Hi"
end
The above block of code will print “Hi” 10 times all on newlines.
To keep a track of the iteration number, .times
can create a block variable that starts of counting the iteration number starting at zero. After each execution of the code within the block, the block variable is incremented by 1.
10.times do |counter|
p counter
end
The above block of code will print the numbers 0 to 9 all on newlines.
Integer#upto do |Integer|
# ruby code here
end
⇒ Integer
The upto
method takes the first Integer
the method is called on and uses it to initialize the value of
the block variable. The second Integer
becomes the stopping condition to the loop as the block variable’
increases by one after each iteration. The method returns an Integer
; the initial value of the block variable.
5.upto(10) do |counter|
# do something
end
The above block of code starts the block variable counter
at 5 and executes the block until counter is 10.
Integer#downto do |Integer|
# ruby code here
end
⇒ Integer
The downto
method takes the first Integer
the method is called on and uses it to initialize the value of
the block variable. The second Integer
becomes the stopping condition to the loop as the block variable’
decreases by one after each iteration. The method returns an Integer
; the initial value of the block variable.
10.downto(5) do |counter|
# do something
end
The above block of code starts the block variable counter
at 10 and executes the block until counter is 5.
Integer#step(Integer, Integer) do |Integer|
# ruby code here
end
⇒ Integer
The step
method initializes the block variable to be the value of the Integer
that called the method. The first Integer
argument is the the value the block variable is when the loop will stop. The last Integer
argument is what value to modify the block variable after each iteration. This method returns the Integer
that called the method.
1.step(10, 3) do |counter|
p counter
end
1
4
7
10
The above block of code starts the block variable counter
at 1 and executes the block until counter is 10 but after each iteration the counter
will be incremented by 3 instead of 1. .step
can also be used to decrement the counter by a certain value.
10.step(1, -4) do |counter|
p counter
end
10
6
2
Array#each do |Object|
# ruby code here
end
⇒ Array
Given an array, the .each
method will loop through each element of the array starting with the very first one.
Returns the Array
the method was called on.
cities = ["Chicago", "LA", "NYC"]
cities.each do |city|
p city
end
"Chicago"
"LA"
"NYC"
The block variable city
holds the value of the elements in the array cities
. It starts with the first element "Chicago"
and then changes with each interation, holding the value of the next element ("LA"
) in the array and so on.
Array#each_with_index do |Object, Integer|
# ruby code here
end
⇒ Array
To keep a track of the iteration number while looping through an array, .each_with_index
creates an additional block variable that starts of counting the iteration number starting at zero. After each execution of the code within the block, the block variable is incremented by 1.
cities.each_with_index do |city, count|
p count.to_s + " " + city
end
"0 Chicago"
"1 LA"
"2 NYC"
city
holds the value of elements in the array cities
. count
holds the index of the element that city
currently holds.
Note:
Variables created as a block variables can only be used within that block (between do
and end
). Using that variable outside that block will throw an error.