Ruby Комментарии.
# Это одностройчный комментарий.
name = 'Eric' # Это тоже однострочный комментарий.
=begin
Это многострочный
комментарий. Он может
размещаться на нескольких строчках.
=end
Ruby Переменные.
Названия переменных должны начинаться со строчной буквы и всегда быть в нижнем регистре. Слова в переменной могут разделяться символом подчеркивания. Названия переменных могут начинаться с других символов, таких как $ или @, но такой подход к именованию переменных крайне нежелателен.
my_number = 100
Ruby Типы переменных: Числа, Строки, Булевы значения.
my_number = 25 # Переменная содержит число.
my_string = 'Ruby' # Переменная содержит строку с текстом.
my_boolean = true # Переменная содержит булево значение true.
Ruby Математические операции.
Сложение (+)
Вычитание (-)
Умножение (*)
Деление (/)
Возведение в степень (**)
Деление по модулю с получением остатка (%)
addition = 1 + 2 # Результат: 3
subtraction = 5 - 3 # Результат: 2
multiplication = 2 * 10 # Результат: 20
division = 15 / 3 # Результат: 5
exponentiation = 2 ** 3 # Результат: 8
modulo = 25 % 7 # Результат: 4
Ruby Приведение занчение к строке. to_s (to_string).
value.to_s
Ruby Вывод результата на экран: Print и Puts.
print 'Данный текст будет выведен на экран.'
puts 'Данный текст тоже будет выведен на экран, но после него будет добавлена дополнительная пустая строка.'
Ruby Строки.
'Строку можно писать в одинарных кавычках.'
"Также строку можно писать в двойных кавычках."
Ruby Сложение (объединение) строк.
text = "Вас " + "зовут " + "Виктор."
puts text # Результат: "Вас зовут Виктор."
Ruby Методы работы со строками: Length, Reverse, Upcase, Downcase, Capitalize.
'Сколько символов в данной строке, включая пробел?'.length
# Результат: 49
'Изменить порядок следования символов в данной строке на обратный'.reverse
# Результат: 'йынтарбо ан екортс йоннад в воловмис яинаводелс кодяроп ьтинемзИ'
'сделать все буквы в данной строке заглавными'.upcase
# Результат: 'СДЕЛАТЬ ВСЕ БУКВЫ В СТРОКЕ ЗАГЛАВНЫМИ'
'СДЕЛАТЬ ВСЕ БУКВЫ В СТРОКЕ СТРОЧНЫМИ'.downcase
# Результат: 'сделать все буквы в данной строке строчными'
'виктор - только первая буква станет заглавной'.capitalize
# Результат: 'Виктор - только первая буква станет заглавной'
Методы можно записывать в цепочку.
'К данной строке будет применено 3 метода подряд, согласно порядку их следования'.upcase.downcase.length
# Результат: 79
# Строка приняла следующий вид: 'к данной строке будет применено 3 метода подряд, согласно порядку их следования'
Обычно любой метод при работе со строками не изменяет исходную строку, а создает её копию, которую передаёт далее по коду.
name = 'виктор'
puts name.capitalize
# Результат: 'Виктор'
puts name
# Результат: 'виктор'
Для того, чтобы метод изменил исходную строку, в конец метода добавляется восклицательный знак (!).
puts name.capitalize!
# Результат: 'Виктор'
puts name
# Результат: 'Виктор'
Ruby Методы работы со строками: Split.
split - берет строку, разделяет её на блоки при нахождении символа и помещает блоки в массив.
text = 'Этот текст будет разделен на блоки: один, два, три.'
blocks = text.split(',')
print blocks.length # Результат: 3 значения в массиве.
Ruby Ввод данных из консоли: gets.chomp
#Запрос на ввод данных в консоли и подстановка введенного значения в переменную name.
name = gets.chomp
gets - запрашивает в консоли ввод данных от пользователя. После ввода данных пользователем Ruby автоматически подставляет пустую строку.
chomp - убирает лишнюю пустую строку, подставленную Ruby.
Ruby Подстановка данных в строку: '#{my_variable}'.
Внимание! В строки, находящиеся в одинарных кавычках значения переменных не подставляются. Подставляйте значения переменных только в строки с двойными кавычками.
name = "Viktor"
puts "Вас зовут #{name}!"
# Результат: "Вас зовут Виктор!"
Ruby Ввод данных в программу из консоли: gets.chomp и подстановка данных в строку: '#{my_variable}'
print 'Какое у вас имя?' # Вывод текста на экран.
first_name = gets.chomp # Запрос на ввод данных в консоли и подстановка введенного значения в переменную name.
first_name.capitalize! # Сделать первую букву заглавной.
print 'Какая у вас фамилия?'
last_name = gets.chomp
last_name.capitalize!
print 'В каком городе вы живете?'
city = gets.chomp
city.capitalize!
print 'Из какой вы страны?'
state = gets.chomp
state.upcase! # Сделать все буквы заглавными.
# Подстановка значений из переменных в строку и вывод итогового текста на экран.
puts "Вас зовут #{first_name} #{last_name} и вы из #{city}, #{state}!"
Ruby Условия: if, elsif, else, end и unless.
if 1 < 2
print 'Этот текст будет выведен на экран, так как 1 меньше, чем 2!'
end
if 1 > 2
print 'Этот текст не будет выведен на экран, так как 1 меньше, чем 2.'
else
print 'Это значит, что на экран будет выведен этот текст!'
end
if x < y # Представим, что x и y это какие-то числа.
puts "x меньше, чем y!"
elsif x > y
puts "x больше, чем y!"
else
puts "x равен y!"
end
print 'Введите число: '
user_number = Integer(gets.chomp)
if user_number < 0
puts 'Вы ввели отрицательное число!'
elsif user_number > 0
puts 'Вы ввели положительное число!'
else
puts 'Вы ввели ноль!"'
end
hungry = false # Это значит, что я не голоден.
unless hungry # Пока не голоден.
puts "Можно писать программы!"
else # В противном случае.
puts "Самое время поесть!"
end
Вы можете также использовать тернарный оператор в качестве замены для назначения:
if boolean?
do_one_thing
else
do_something_else
end
В этом случаем данное выражение будет выглядеть так:
boolean? ? do_one_thing : do_something_else
Ruby Сравнение значений: ==, !=, >, >=, <, <=.
Равно (==)
Не равно (!=)
Больше (>)
Больше или равно (>=)
Меньше (<)
Меньше или равно (<=)
x = 2
y = 2
if x == y
print "x равен y!"
end
Помещение результата от сравнения значений в переменную.
test_1 = 77 != 77
# Результат: test_1 = false
test_2 = -4 <= -4
# Результат: test_2 = true
test_3 = -44 < -33
# Результат: test_3 = true
test_4 = 100 == 1000
# Результат: test_4 = false
Ruby Логические булевы опараторы: &&, ||, !.
Логическое И (&&)
Логическое Или (||)
Логическое Не (!)
boolean_and = (77 < 78) && (77 < 77)
# Результат: boolean_and = false
boolean_or = false || (-10 > -9)
# Результат: boolean_or = false
boolean_not = !((700 / 10) == 70)
# Результат: boolean_not = false
Логические операторы можно комбинировать в одном выражении.
boolean_combination = (3 < 4 || false) && (false || true)
# Результат: boolean_not = true
Ruby Проверка нахождения символов в строке: Include?
string_to_check = 'This string has the substring.'
if string_to_check.include? 'substring'
puts 'Строка содержит данные символы!'
end
Ruby Глобальная замена символов в строке: Gsub.
gsub - сокращение от global substitution, что переводится как глобальная замена.
string_to_check = 'This string has the substring.'
# Замена в строке всех символов s на символы th.
string_to_check.gsub!(/s/, 'th')
puts string_to_check
# Результат: 'Thith thtring hath the thubthtring.'
Ruby Циклы: For.
for num in 1...10
puts num
end
1...10 - это диапазон значений (range) от 1 до 9. Поскольку в диапазоне указано троеточие (...), то последнее значение исключается из диапазона. Это означает, что будут использоваться все значения по порядку, за исключением последнего.
Если в диапазоне указана две точки (..), то Ruby включит все значения в диапазон.
for num in 1..10
puts num
end
Ruby Циклы: Loop DO, Break, Next.
i = 0
loop do
i += 1
print "#{i}"
break if i > 5
end
i = 20
loop do
i -= 1
next if i % 2 == 0 # Аналог continue в других языках программирования.
print "#{i}"
break if i <= 0
end
Ruby Циклы: While, Until.
counter = 1
while counter < 10
puts counter
counter = counter + 1
end
counter = 1
until counter > 10
puts counter
counter = counter + 1
end
Ruby Инкремент и Декремент: +=, -=, *=, /=.
Ruby не имеет операторов вида ++ и --, имеющихся в других языках программирования. Вместо них используются следующие операторы: +=, -=, *=, /=.
counter += 1 # Эквивалентно counter = counter + 1
counter -= 1 # Эквивалентно counter = counter - 1
counter *= 2 # Эквивалентно counter = counter * 2
counter /= 2 # Эквивалентно counter = counter / 2
Ruby Массивы: Array.
Массивы могут содержать абсолютно любые значения, включая объекты, функции, булевы значения, строки, числа и так далее, а так же другие массивы.
my_array = [1, 2, 3, 4, 5]
array_value = my_array[0] # Результат: array_value = 1
array_value = my_array[-1] # Результат: array_value = 5
multi_d_array = [[1,2,3,4],[0,0,0,0],[0,0,0,0],[0,0,0,0]]
multi_d_array_value = multi_d_array[0][1] # Результат: multi_d_array_value = 2
Ruby Добавление элемента в массив: Push и <<.
my_array = [1, 2, 3, 4, 5]
my_array.push(6) # Результат: my_array = [1, 2, 3, 4, 5, 6]
Аналогично можно затолкнуть данные в массив следующим образом:
my_array << 7 << 8 # Результат: my_array = [1, 2, 3, 4, 5, 6, 7, 8]
Ruby Добавление текста к каждому элементу массива: Join.
my_array = [1, 2, 3, 4, 5]
my_array.join(', ') # Результат (добавление пустых пробелов): [1, 2, 3, 4, 5]
Ruby Преобразования диапазона (range) в массив: to_a.
(0..9).to_a # Результат: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
('a'..'e').to_a # Результат: ["a", "b", "c", "d", "e"]
Ruby Вытаскивание элементов из массива с помощью диапазона.
my_array =["foo", "bar", "baz", "quux"]
my_array[0..2] # Результат: ["foo", "bar", "baz"]
Ruby Перебор массивов в цикле: Each.
2 варианта написания each:
object.each { |item|
# Do something
}
Вместо скобок {} можно испльзовать do.
object.each do |item|
# Do something
end
Переменная между скобками | | может быть всем, что угодно, это просто место для размещения каждого элемента, используемого внутри цикла each.
array = [1,2,3,4,5]
array.each do |x|
x += 10
print "#{x}"
end
Ruby Повтор действий в цикле: Times.
10.times {
print "Ура!"
}
Ruby Хэш-массивы (ассоциативные массивы): литеральное создание {}.
my_hash = {
"name" => "Eric",
"age" => 26,
"hungry?" => true
}
puts my_hash["name"]
puts my_hash["age"]
puts my_hash["hungry?"]
Как и обычные массивы, Хэш-массивы могут быть вложенными и содержать все, что угодно.
params = {}
params[:user] = {
:name => "Michael Hartl",
:email => "mhartl@example.com"
}
params[:user][:email] # Результат: "mhartl@example.com"
Ruby Хэш-массивы: Hash.new.
my_hash = Hash.new
Данная конструкция аналогична
my_hash = {}
Ruby Добавление значение в Хэш-массив.
pets = Hash.new
pets['Stevie'] = 'cat'
puts pets['Stevie']
Можно сделать так:
my_hash = Hash.new('Первый элемент массива.')
puts my_hash[0] # Результат: 'Первый элемент массива.'
Ruby Символы в Хэш-массивах.
Символы можно просто воспринимать, как обычные строки, но без возможности добавлять к ним методы, которые допустимы при работе со строками.
В Хэш-массивах символы можно использовать в качестве ключей.
user = {
:name => "Michael Hartl",
:email => "michael@example.com"
}
user[:name] # Результат: "Michael Hartl"
Данный код аналогичен следующему коду:
user = {
"name" => "Michael Hartl",
"email" => "michael@example.com"
}
user["name"] # Результат: "Michael Hartl
Ruby Циклический перебор значений массивов.
friends = ["Milhouse", "Ralph", "Nelson", "Otto"]
family = {
"Homer" => "dad",
"Marge" => "mom",
"Lisa" => "sister",
"Maggie" => "sister",
"Abe" => "grandpa",
"Santa's Little Helper" => "dog"
}
friends.each { |x| puts "#{x}" }
family.each { |x, y| puts "#{x}: #{y}" }
Ruby Циклический перебор вложенных массивов.
s = [["ham", "swiss"], ["turkey", "cheddar"], ["roast beef", "gruyere"]]
s.each do | x |
x.each do | y |
puts y
end
end
Ruby Циклический перебор Хэш-массивов.
secret_identities = {
"The Batman" => "Bruce Wayne",
"Superman" => "Clark Kent",
"Wonder Woman" => "Diana Prince",
"Freakazoid" => "Dexter Douglas"
}
hash.each { |key, value|
puts "#{key}: #{value}"
}
Ruby Сортировка массивов: Sort.
h = h.sort_by {|a, b| b}
my_array = [3, 4, 8, 7, 1, 6, 5, 9, 2]
my_array.sort! # Результат: [1, 2, 3, 4, 5, 6, 7, 8, 9]
books = [
"Charlie and the Chocolate Factory",
"War and Peace",
"Utopia",
"A Brief History of Time",
"A Wrinkle in Time"
]
books.sort!
# Результат:
[
"A Brief History of Time",
"A Wrinkle in Time",
"Charlie and the Chocolate Factory",
"Utopia",
"War and Peace"
]
Ruby Сравнение массивов: <=>.
<=> - это оператор сравнения массивов. Он возвращает:
0 - если первый массив равен второму,
1 - если первый массив больше, чем второй,
-1 - если первый массив меньше, чем второй.
array_1 <=> array_2
array_1 = [1,2,3,4,5]
array_2 = [1,2,3,4,5]
puts array_1 <=> array_2
Ruby Функции и методы.
def welcome
puts "Welcome to Ruby!"
end
welcome
def enter_number (n)
puts "#{n} - это число."
end
enter_number (10) # Результат: 10 - это число.
def cube(n)
return n ** 3
end
output = cube(3)
puts output # Результат: 27
В Ruby скобки у функций не являются обязательными.
Данные записи будут эквивалентны:
stylesheet_link_tag ('blueprint/screen', :media => 'screen')
stylesheet_link_tag 'blueprint/screen', :media => 'screen'
И когда Хэш-массив является последним аргументом функции, то фигурные скобки для него не являются обязательными.
Данные записи будут эквивалентны:
stylesheet_link_tag 'blueprint/screen', {:media => 'screen'}
stylesheet_link_tag 'blueprint/screen', :media => 'screen'
Если метод возвращает значение true или false, то в конце его имени желательно ставить знак вопроса (?).
def validate? (a)
if a == 1
return true
else
return false
end
end
validate? (1)
Ruby Анонимные функции или блоки кода: {}.
Анонимные функции или блоки кода могут быть определены внутри do - end или внутри фигурных скобок { }.
Анонимные функции вызываются сразу и срабатывают только один раз в контексте программы.
1.times do
puts "I'm a code block!"
end
1.times { puts "As am I!" }
Функции могут принимать блоки в качестве параметров. В этом смысле они похожи на объекты или массивы.
Ruby Классы.
class Person
attr_accessor :fname, :lname
def initialize(fname, lname)
@fname = fname # Это внутренняя переменная экземпляра класса.
@lname = lname # Это внутренняя переменная экземпляра класса.
end
def to_s
@lname + ", " + @fname
end
end
Person.new("David", "Thomas")
или просто
human = Person.new
Ключевое слово self будет являться ссылкой на сам объект (как слово this).
Self также может задавать и внутренний метод класса:
class CreateUsers < ActiveRecord::Migration
def self.down # self делает метод down внутренним методом класса CreateUsers.
drop_table :users
end
end
Все методы, написанные в классе после ключевого слова Private, используются только внутри объекта и не предназначены для публичного использования.
class User < ActiveRecord::Base
private
def encrypt_password
self.encrypted_password = encrypt(password)
end
def encrypt(string)
string # Only a temporary implementation!
end
end
Ruby Наследование классов.
class BigInteger < Number
def initialize(value)
@value = value # Это переменная экземпляра класса. То есть внутренняя this или self переменная, как в других языках программирования.
end
end
Ruby Добавление методов в классы.
Ruby позволяет добавлять методы в классы, в том числе во встроенные классы.
Однако считается дурным тоном добавлять методы во встроенные классы или изменять их.
class String
# Метод возвращает true, если строка равна себе, но перевернутой.
def palindrome?
self == self.reverse
end
end
"deified".palindrome? #Результат: true
Ruby Добавление методов в классы через модули.
# lib/position_mover.rb
module PositionMover
def move_to_position (new_position)
...
end
end
# app/models/subject.rb
class Subject < ActiveRecord::Base
include PositionMover
end
Ruby Определение класса и суперкласса (родительского класса) объекта: Class и Superclass.
s = 'Это строковый объект'
puts s.class # Результат: String
s = String.new("foobar")
s.class # Результат: String
s.class.superclass # Результат: Object
s.class.superclass.superclass # Результат: BasicObject
s.class.superclass.superclass.superclass # Результат: nil
Ruby Создание Getter и Setter методов.
class User
attr_accessor :name, :email
def initialize(attributes = {})
@name = attributes[:name]
@email = attributes[:email]
end
def formatted_email
"#{@name} <#{@email}>"
end
end
attr_accessor :name, :email - создает атрибуты доступа соответствующие имени пользователя и адресу электронной почты. Он создает методы получатель (getter) и установщик (setter), которые позволяют нам получать (get) и назначать (set) переменные экземпляра класса @name и @email.
initialize - специальный метод в Ruby. Этот метод вызывается, когда мы выполняем User.new. Этот метод принимает один аргумент: attributes.
attributes - это переменная, которая имеет значение по умолчанию равное пустому хэшу, так что мы можем определить пользователя без имени или адреса электронной почты (напомним, что хэш-массивы возвращают nil на несуществующие ключи, поэтому attributes[:name] будет nil, если нет :name ключа, и так же для attributes[:email]).
Ruby Загрузка кода из файла.
require './example_user'
example = User.new
example.name = "Example User"
example.email = "user@example.com"
example.formatted_email # Результат: "Example User <user@example.com>"
Или можно записать так:
user = User.new(:name => "Michael Hartl", :email => "mhartl@example.com")
user.formatted_email # Результат: "Michael Hartl <mhartl@example.com>"
# Это одностройчный комментарий.
name = 'Eric' # Это тоже однострочный комментарий.
=begin
Это многострочный
комментарий. Он может
размещаться на нескольких строчках.
=end
Ruby Переменные.
Названия переменных должны начинаться со строчной буквы и всегда быть в нижнем регистре. Слова в переменной могут разделяться символом подчеркивания. Названия переменных могут начинаться с других символов, таких как $ или @, но такой подход к именованию переменных крайне нежелателен.
my_number = 100
Ruby Типы переменных: Числа, Строки, Булевы значения.
my_number = 25 # Переменная содержит число.
my_string = 'Ruby' # Переменная содержит строку с текстом.
my_boolean = true # Переменная содержит булево значение true.
Ruby Математические операции.
Сложение (+)
Вычитание (-)
Умножение (*)
Деление (/)
Возведение в степень (**)
Деление по модулю с получением остатка (%)
addition = 1 + 2 # Результат: 3
subtraction = 5 - 3 # Результат: 2
multiplication = 2 * 10 # Результат: 20
division = 15 / 3 # Результат: 5
exponentiation = 2 ** 3 # Результат: 8
modulo = 25 % 7 # Результат: 4
Ruby Приведение занчение к строке. to_s (to_string).
value.to_s
Ruby Вывод результата на экран: Print и Puts.
print 'Данный текст будет выведен на экран.'
puts 'Данный текст тоже будет выведен на экран, но после него будет добавлена дополнительная пустая строка.'
Ruby Строки.
'Строку можно писать в одинарных кавычках.'
"Также строку можно писать в двойных кавычках."
Ruby Сложение (объединение) строк.
text = "Вас " + "зовут " + "Виктор."
puts text # Результат: "Вас зовут Виктор."
Ruby Методы работы со строками: Length, Reverse, Upcase, Downcase, Capitalize.
'Сколько символов в данной строке, включая пробел?'.length
# Результат: 49
'Изменить порядок следования символов в данной строке на обратный'.reverse
# Результат: 'йынтарбо ан екортс йоннад в воловмис яинаводелс кодяроп ьтинемзИ'
'сделать все буквы в данной строке заглавными'.upcase
# Результат: 'СДЕЛАТЬ ВСЕ БУКВЫ В СТРОКЕ ЗАГЛАВНЫМИ'
'СДЕЛАТЬ ВСЕ БУКВЫ В СТРОКЕ СТРОЧНЫМИ'.downcase
# Результат: 'сделать все буквы в данной строке строчными'
'виктор - только первая буква станет заглавной'.capitalize
# Результат: 'Виктор - только первая буква станет заглавной'
Методы можно записывать в цепочку.
'К данной строке будет применено 3 метода подряд, согласно порядку их следования'.upcase.downcase.length
# Результат: 79
# Строка приняла следующий вид: 'к данной строке будет применено 3 метода подряд, согласно порядку их следования'
Обычно любой метод при работе со строками не изменяет исходную строку, а создает её копию, которую передаёт далее по коду.
name = 'виктор'
puts name.capitalize
# Результат: 'Виктор'
puts name
# Результат: 'виктор'
Для того, чтобы метод изменил исходную строку, в конец метода добавляется восклицательный знак (!).
puts name.capitalize!
# Результат: 'Виктор'
puts name
# Результат: 'Виктор'
Ruby Методы работы со строками: Split.
split - берет строку, разделяет её на блоки при нахождении символа и помещает блоки в массив.
text = 'Этот текст будет разделен на блоки: один, два, три.'
blocks = text.split(',')
print blocks.length # Результат: 3 значения в массиве.
Ruby Ввод данных из консоли: gets.chomp
#Запрос на ввод данных в консоли и подстановка введенного значения в переменную name.
name = gets.chomp
gets - запрашивает в консоли ввод данных от пользователя. После ввода данных пользователем Ruby автоматически подставляет пустую строку.
chomp - убирает лишнюю пустую строку, подставленную Ruby.
Ruby Подстановка данных в строку: '#{my_variable}'.
Внимание! В строки, находящиеся в одинарных кавычках значения переменных не подставляются. Подставляйте значения переменных только в строки с двойными кавычками.
name = "Viktor"
puts "Вас зовут #{name}!"
# Результат: "Вас зовут Виктор!"
Ruby Ввод данных в программу из консоли: gets.chomp и подстановка данных в строку: '#{my_variable}'
print 'Какое у вас имя?' # Вывод текста на экран.
first_name = gets.chomp # Запрос на ввод данных в консоли и подстановка введенного значения в переменную name.
first_name.capitalize! # Сделать первую букву заглавной.
print 'Какая у вас фамилия?'
last_name = gets.chomp
last_name.capitalize!
print 'В каком городе вы живете?'
city = gets.chomp
city.capitalize!
print 'Из какой вы страны?'
state = gets.chomp
state.upcase! # Сделать все буквы заглавными.
# Подстановка значений из переменных в строку и вывод итогового текста на экран.
puts "Вас зовут #{first_name} #{last_name} и вы из #{city}, #{state}!"
Ruby Условия: if, elsif, else, end и unless.
if 1 < 2
print 'Этот текст будет выведен на экран, так как 1 меньше, чем 2!'
end
if 1 > 2
print 'Этот текст не будет выведен на экран, так как 1 меньше, чем 2.'
else
print 'Это значит, что на экран будет выведен этот текст!'
end
if x < y # Представим, что x и y это какие-то числа.
puts "x меньше, чем y!"
elsif x > y
puts "x больше, чем y!"
else
puts "x равен y!"
end
print 'Введите число: '
user_number = Integer(gets.chomp)
if user_number < 0
puts 'Вы ввели отрицательное число!'
elsif user_number > 0
puts 'Вы ввели положительное число!'
else
puts 'Вы ввели ноль!"'
end
hungry = false # Это значит, что я не голоден.
unless hungry # Пока не голоден.
puts "Можно писать программы!"
else # В противном случае.
puts "Самое время поесть!"
end
Вы можете также использовать тернарный оператор в качестве замены для назначения:
if boolean?
do_one_thing
else
do_something_else
end
В этом случаем данное выражение будет выглядеть так:
boolean? ? do_one_thing : do_something_else
Ruby Сравнение значений: ==, !=, >, >=, <, <=.
Равно (==)
Не равно (!=)
Больше (>)
Больше или равно (>=)
Меньше (<)
Меньше или равно (<=)
x = 2
y = 2
if x == y
print "x равен y!"
end
Помещение результата от сравнения значений в переменную.
test_1 = 77 != 77
# Результат: test_1 = false
test_2 = -4 <= -4
# Результат: test_2 = true
test_3 = -44 < -33
# Результат: test_3 = true
test_4 = 100 == 1000
# Результат: test_4 = false
Ruby Логические булевы опараторы: &&, ||, !.
Логическое И (&&)
Логическое Или (||)
Логическое Не (!)
boolean_and = (77 < 78) && (77 < 77)
# Результат: boolean_and = false
boolean_or = false || (-10 > -9)
# Результат: boolean_or = false
boolean_not = !((700 / 10) == 70)
# Результат: boolean_not = false
Логические операторы можно комбинировать в одном выражении.
boolean_combination = (3 < 4 || false) && (false || true)
# Результат: boolean_not = true
Ruby Проверка нахождения символов в строке: Include?
string_to_check = 'This string has the substring.'
if string_to_check.include? 'substring'
puts 'Строка содержит данные символы!'
end
Ruby Глобальная замена символов в строке: Gsub.
gsub - сокращение от global substitution, что переводится как глобальная замена.
string_to_check = 'This string has the substring.'
# Замена в строке всех символов s на символы th.
string_to_check.gsub!(/s/, 'th')
puts string_to_check
# Результат: 'Thith thtring hath the thubthtring.'
Ruby Циклы: For.
for num in 1...10
puts num
end
1...10 - это диапазон значений (range) от 1 до 9. Поскольку в диапазоне указано троеточие (...), то последнее значение исключается из диапазона. Это означает, что будут использоваться все значения по порядку, за исключением последнего.
Если в диапазоне указана две точки (..), то Ruby включит все значения в диапазон.
for num in 1..10
puts num
end
Ruby Циклы: Loop DO, Break, Next.
i = 0
loop do
i += 1
print "#{i}"
break if i > 5
end
i = 20
loop do
i -= 1
next if i % 2 == 0 # Аналог continue в других языках программирования.
print "#{i}"
break if i <= 0
end
Ruby Циклы: While, Until.
counter = 1
while counter < 10
puts counter
counter = counter + 1
end
counter = 1
until counter > 10
puts counter
counter = counter + 1
end
Ruby Инкремент и Декремент: +=, -=, *=, /=.
Ruby не имеет операторов вида ++ и --, имеющихся в других языках программирования. Вместо них используются следующие операторы: +=, -=, *=, /=.
counter += 1 # Эквивалентно counter = counter + 1
counter -= 1 # Эквивалентно counter = counter - 1
counter *= 2 # Эквивалентно counter = counter * 2
counter /= 2 # Эквивалентно counter = counter / 2
Ruby Массивы: Array.
Массивы могут содержать абсолютно любые значения, включая объекты, функции, булевы значения, строки, числа и так далее, а так же другие массивы.
my_array = [1, 2, 3, 4, 5]
array_value = my_array[0] # Результат: array_value = 1
array_value = my_array[-1] # Результат: array_value = 5
multi_d_array = [[1,2,3,4],[0,0,0,0],[0,0,0,0],[0,0,0,0]]
multi_d_array_value = multi_d_array[0][1] # Результат: multi_d_array_value = 2
Ruby Добавление элемента в массив: Push и <<.
my_array = [1, 2, 3, 4, 5]
my_array.push(6) # Результат: my_array = [1, 2, 3, 4, 5, 6]
Аналогично можно затолкнуть данные в массив следующим образом:
my_array << 7 << 8 # Результат: my_array = [1, 2, 3, 4, 5, 6, 7, 8]
Ruby Добавление текста к каждому элементу массива: Join.
my_array = [1, 2, 3, 4, 5]
my_array.join(', ') # Результат (добавление пустых пробелов): [1, 2, 3, 4, 5]
Ruby Преобразования диапазона (range) в массив: to_a.
(0..9).to_a # Результат: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
('a'..'e').to_a # Результат: ["a", "b", "c", "d", "e"]
Ruby Вытаскивание элементов из массива с помощью диапазона.
my_array =["foo", "bar", "baz", "quux"]
my_array[0..2] # Результат: ["foo", "bar", "baz"]
Ruby Перебор массивов в цикле: Each.
2 варианта написания each:
object.each { |item|
# Do something
}
Вместо скобок {} можно испльзовать do.
object.each do |item|
# Do something
end
Переменная между скобками | | может быть всем, что угодно, это просто место для размещения каждого элемента, используемого внутри цикла each.
array = [1,2,3,4,5]
array.each do |x|
x += 10
print "#{x}"
end
Ruby Повтор действий в цикле: Times.
10.times {
print "Ура!"
}
Ruby Хэш-массивы (ассоциативные массивы): литеральное создание {}.
my_hash = {
"name" => "Eric",
"age" => 26,
"hungry?" => true
}
puts my_hash["name"]
puts my_hash["age"]
puts my_hash["hungry?"]
Как и обычные массивы, Хэш-массивы могут быть вложенными и содержать все, что угодно.
params = {}
params[:user] = {
:name => "Michael Hartl",
:email => "mhartl@example.com"
}
params[:user][:email] # Результат: "mhartl@example.com"
Ruby Хэш-массивы: Hash.new.
my_hash = Hash.new
Данная конструкция аналогична
my_hash = {}
Ruby Добавление значение в Хэш-массив.
pets = Hash.new
pets['Stevie'] = 'cat'
puts pets['Stevie']
Можно сделать так:
my_hash = Hash.new('Первый элемент массива.')
puts my_hash[0] # Результат: 'Первый элемент массива.'
Ruby Символы в Хэш-массивах.
Символы можно просто воспринимать, как обычные строки, но без возможности добавлять к ним методы, которые допустимы при работе со строками.
В Хэш-массивах символы можно использовать в качестве ключей.
user = {
:name => "Michael Hartl",
:email => "michael@example.com"
}
user[:name] # Результат: "Michael Hartl"
Данный код аналогичен следующему коду:
user = {
"name" => "Michael Hartl",
"email" => "michael@example.com"
}
user["name"] # Результат: "Michael Hartl
Ruby Циклический перебор значений массивов.
friends = ["Milhouse", "Ralph", "Nelson", "Otto"]
family = {
"Homer" => "dad",
"Marge" => "mom",
"Lisa" => "sister",
"Maggie" => "sister",
"Abe" => "grandpa",
"Santa's Little Helper" => "dog"
}
friends.each { |x| puts "#{x}" }
family.each { |x, y| puts "#{x}: #{y}" }
Ruby Циклический перебор вложенных массивов.
s = [["ham", "swiss"], ["turkey", "cheddar"], ["roast beef", "gruyere"]]
s.each do | x |
x.each do | y |
puts y
end
end
Ruby Циклический перебор Хэш-массивов.
secret_identities = {
"The Batman" => "Bruce Wayne",
"Superman" => "Clark Kent",
"Wonder Woman" => "Diana Prince",
"Freakazoid" => "Dexter Douglas"
}
hash.each { |key, value|
puts "#{key}: #{value}"
}
Ruby Сортировка массивов: Sort.
h = h.sort_by {|a, b| b}
my_array = [3, 4, 8, 7, 1, 6, 5, 9, 2]
my_array.sort! # Результат: [1, 2, 3, 4, 5, 6, 7, 8, 9]
books = [
"Charlie and the Chocolate Factory",
"War and Peace",
"Utopia",
"A Brief History of Time",
"A Wrinkle in Time"
]
books.sort!
# Результат:
[
"A Brief History of Time",
"A Wrinkle in Time",
"Charlie and the Chocolate Factory",
"Utopia",
"War and Peace"
]
Ruby Сравнение массивов: <=>.
<=> - это оператор сравнения массивов. Он возвращает:
0 - если первый массив равен второму,
1 - если первый массив больше, чем второй,
-1 - если первый массив меньше, чем второй.
array_1 <=> array_2
array_1 = [1,2,3,4,5]
array_2 = [1,2,3,4,5]
puts array_1 <=> array_2
Ruby Функции и методы.
def welcome
puts "Welcome to Ruby!"
end
welcome
def enter_number (n)
puts "#{n} - это число."
end
enter_number (10) # Результат: 10 - это число.
def cube(n)
return n ** 3
end
output = cube(3)
puts output # Результат: 27
В Ruby скобки у функций не являются обязательными.
Данные записи будут эквивалентны:
stylesheet_link_tag ('blueprint/screen', :media => 'screen')
stylesheet_link_tag 'blueprint/screen', :media => 'screen'
И когда Хэш-массив является последним аргументом функции, то фигурные скобки для него не являются обязательными.
Данные записи будут эквивалентны:
stylesheet_link_tag 'blueprint/screen', {:media => 'screen'}
stylesheet_link_tag 'blueprint/screen', :media => 'screen'
Если метод возвращает значение true или false, то в конце его имени желательно ставить знак вопроса (?).
def validate? (a)
if a == 1
return true
else
return false
end
end
validate? (1)
Ruby Анонимные функции или блоки кода: {}.
Анонимные функции или блоки кода могут быть определены внутри do - end или внутри фигурных скобок { }.
Анонимные функции вызываются сразу и срабатывают только один раз в контексте программы.
1.times do
puts "I'm a code block!"
end
1.times { puts "As am I!" }
Функции могут принимать блоки в качестве параметров. В этом смысле они похожи на объекты или массивы.
Ruby Классы.
class Person
attr_accessor :fname, :lname
def initialize(fname, lname)
@fname = fname # Это внутренняя переменная экземпляра класса.
@lname = lname # Это внутренняя переменная экземпляра класса.
end
def to_s
@lname + ", " + @fname
end
end
Person.new("David", "Thomas")
или просто
human = Person.new
Ключевое слово self будет являться ссылкой на сам объект (как слово this).
Self также может задавать и внутренний метод класса:
class CreateUsers < ActiveRecord::Migration
def self.down # self делает метод down внутренним методом класса CreateUsers.
drop_table :users
end
end
Все методы, написанные в классе после ключевого слова Private, используются только внутри объекта и не предназначены для публичного использования.
class User < ActiveRecord::Base
private
def encrypt_password
self.encrypted_password = encrypt(password)
end
def encrypt(string)
string # Only a temporary implementation!
end
end
Ruby Наследование классов.
class BigInteger < Number
def initialize(value)
@value = value # Это переменная экземпляра класса. То есть внутренняя this или self переменная, как в других языках программирования.
end
end
Ruby Добавление методов в классы.
Ruby позволяет добавлять методы в классы, в том числе во встроенные классы.
Однако считается дурным тоном добавлять методы во встроенные классы или изменять их.
class String
# Метод возвращает true, если строка равна себе, но перевернутой.
def palindrome?
self == self.reverse
end
end
"deified".palindrome? #Результат: true
Ruby Добавление методов в классы через модули.
# lib/position_mover.rb
module PositionMover
def move_to_position (new_position)
...
end
end
# app/models/subject.rb
class Subject < ActiveRecord::Base
include PositionMover
end
Ruby Определение класса и суперкласса (родительского класса) объекта: Class и Superclass.
s = 'Это строковый объект'
puts s.class # Результат: String
s = String.new("foobar")
s.class # Результат: String
s.class.superclass # Результат: Object
s.class.superclass.superclass # Результат: BasicObject
s.class.superclass.superclass.superclass # Результат: nil
Ruby Создание Getter и Setter методов.
class User
attr_accessor :name, :email
def initialize(attributes = {})
@name = attributes[:name]
@email = attributes[:email]
end
def formatted_email
"#{@name} <#{@email}>"
end
end
attr_accessor :name, :email - создает атрибуты доступа соответствующие имени пользователя и адресу электронной почты. Он создает методы получатель (getter) и установщик (setter), которые позволяют нам получать (get) и назначать (set) переменные экземпляра класса @name и @email.
initialize - специальный метод в Ruby. Этот метод вызывается, когда мы выполняем User.new. Этот метод принимает один аргумент: attributes.
attributes - это переменная, которая имеет значение по умолчанию равное пустому хэшу, так что мы можем определить пользователя без имени или адреса электронной почты (напомним, что хэш-массивы возвращают nil на несуществующие ключи, поэтому attributes[:name] будет nil, если нет :name ключа, и так же для attributes[:email]).
Ruby Загрузка кода из файла.
require './example_user'
example = User.new
example.name = "Example User"
example.email = "user@example.com"
example.formatted_email # Результат: "Example User <user@example.com>"
Или можно записать так:
user = User.new(:name => "Michael Hartl", :email => "mhartl@example.com")
user.formatted_email # Результат: "Michael Hartl <mhartl@example.com>"
Комментариев нет:
Отправить комментарий