Ruby

Знакомство с языком Ruby

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° вСрсии ruby

ruby -v

ОбновлСниС ruby

curl -L https://get.rvm.io | bash -s stable

Установка Π½ΡƒΠΆΠ½ΠΎΠΉ вСрсии ruby

rvm install ruby-2.4.2

Π’Ρ‹Π²ΠΎΠ΄ сообщСний Π² консоль

print - Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ строку Π±Π΅Π· пСрСносов (ΠΌΠΎΠΆΠ½ΠΎ Π² ΠΊΠΎΠ½Ρ†Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ \n) puts - Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ строку ΠΈ ставит пСрСнос Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку

print "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!\n"
print "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!\n"
puts "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!"
puts "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!"

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…

Π’ ruby присутствуСт 5 Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…:

  • int
  • float
  • string
  • boolean
  • nil
age = 29
puts(age) # 29
 
money = 29.80
puts(money) # 29.80
 
name = 'ОлСг'
isValid = true
none = nil # это отсутствиС значСния

Β Π‘Ρ‚Ρ€ΠΎΠΊΠΈ ΠΈ матСматичСскиС дСйствия

  • downcase - ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π² Π½ΠΈΠΆΠ½ΠΈΠΉ рСгистр
  • upcase - ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π² Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ рСгистр
  • strip - ΡƒΠ±ΠΈΡ€Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹
  • length - Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΄Π»ΠΈΠ½Ρƒ
  • include? - позволяСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π»ΠΈ пСрСмСнная Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
words = 'Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ '
word = '\'Мило\''
puts(words.downcase() + word.upcase())
 
nothing = '    НичСго    '
puts(nothing.strip())
 
length = 'Π”Π»ΠΈΠ½Π°'
puts(length.length())
 
name = 'Π’Π°Π»Π΅Ρ€Π°'
puts(name.include? 'Π’Π°')

Π£ нас Π΅ΡΡ‚ΡŒ всС основныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΡΡ‚ΡŒ ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках.

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² puts ΠΌΡ‹ складываСм сСйчас Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…, поэтому Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΌΡ‹ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌ ΠΊ строкС Ρ‡Π΅Ρ€Π΅Π· to_s

x = 5
y = 11
 
res = x + y
res = x - y
res = x * y
res = x / y
res = x ** y
res = y % x
 
puts("Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ остатка ΠΎΡ‚ дСлСния: " + res.to_s)
 
number = 14.55
 
puts(number.abs()) # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ число
puts(number.round()) # ΠΎΠΊΡ€ΡƒΠ³Π»ΠΈΡ‚ Π² Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ сторону
puts(Math.sqrt(144)) # вычислит ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠΎΡ€Π΅Π½ΡŒ ΠΈΠ· 144

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gets ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π² консоли ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ тСкст ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

puts('Hello, what\'s your name:');
name = gets;
puts("Asking for you," + name + ", man");
 
puts('Hello, what\'s your name:');
name = gets.chomp(); # ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π½Π° Π½ΠΎΠ²ΡƒΡŽ строку
puts("Asking for you," + name + ", man")

И Ρ‚ΡƒΡ‚ ΠΌΡ‹ сразу ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ значСния ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠΌ ΠΈΡ… Π² числа Ρ‡Π΅Ρ€Π΅Π· to_i ΠΈΠ»ΠΈ to_f

print("ΠŸΠ΅Ρ€Π²ΠΎΠ΅ число: ");
x = gets.chomp();
print("Π’Ρ‚ΠΎΡ€ΠΎΠ΅ число: ");
y = gets.chomp().to_i; # Ссли Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Π΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ числа, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠΌ Ρ‡Π΅Ρ€Π΅Π· to_f
puts(x.to_i + y);

ΠœΠ°ΡΡΠΈΠ²Ρ‹ ΠΈ ассоциативныС массивы

ΠœΠ°ΡΡΠΈΠ²Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово Array.

АссоциативныС массивы ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ {} ΠΈ ΠΏΠ°Ρ€Ρ‹ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ заносятся Ρ‡Π΅Ρ€Π΅Π· =>

arr = Array[1, 2, 3, 4, true, "Oleg"];
arrNames = Array['Oleg', 'Anton', 'Vladislav'];
 
puts(arr); # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ вСсь массив
puts(arrNames[0]); # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ элСмСнт
puts(arrNames[1, 2]); # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½
 
list = Array.new; # создаём пустой массив Π±Π΅Π· элСмСнтов
list[0] = 1;
list[4] = 4;
puts list.length(); # длина массива
puts list.reverse(); # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ массив Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС
puts list.include? 1; # Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ элСмСнт Π² массивС
 
#ассоциативный массив
countries = {
    "RU" => "Russia",
    1 => "Australia",
    :US => "United States"
};
 
puts countries["RU"]; # Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ассоциативноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
puts countries[1];
puts countries[:US];

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ return

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ def

def sum(a, b)
  res = a + b
  return res
end
 
res = sum(3, 4)
puts res # Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ 7

УсловныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ if ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π»ΠΎΠΊΠ° ΠΊΠΎΠ΄Π°, Ссли Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ условиС истинно

x = 5
if x > 10
  puts "x большС 10"
elsif x > 5
  puts "x большС 5"
else
  puts "x мСньшС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΠΎ 5"
end

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ unless ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π»ΠΎΠΊΠ° ΠΊΠΎΠ΄Π°, Ссли Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ условиС Π»ΠΎΠΆΠ½ΠΎ

x = 5
unless x > 10
  puts "x мСньшС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΠΎ 10"
else
  puts "x большС 10"
end

Π¦ΠΈΠΊΠ» While ΠΈ Ρ†ΠΈΠΊΠ» For

Π¦ΠΈΠΊΠ» while выполняСт Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°, ΠΏΠΎΠΊΠ° Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ условиС истинно

x = 0
while x < 5
  puts x
  x += 1
end

Π¦ΠΈΠΊΠ» for ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π»ΠΎΠΊΠ° ΠΊΠΎΠ΄Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ Π½Π°Π±ΠΎΡ€Π΅

for i in 1..5
  puts i
end

Π’ Ruby Ρ†ΠΈΠΊΠ» for часто замСняСтся Ρ†ΠΈΠΊΠ»ΠΎΠΌ each

(1..5).each do |i|
  puts i
end

Π Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΈΜ†Π»Π°ΠΌΠΈ (Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись)

Для чтСния содСрТимого Ρ„Π°ΠΉΠ»Π° Π² Ruby ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ класс File

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ построчного Π²Ρ‹Π²ΠΎΠ΄Π° строк ΠΈΠ· Ρ„Π°ΠΉΠ»Π°:

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ β€œfile.txt” Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ чтСния ("r") ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ each_line, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» построчно. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку Π½Π° экран.

File.open("file.txt", "r") do |file|
  file.each_line do |line|
    puts line
  end
end

Для записи Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„Π°ΠΉΠ» Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ класс File. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ строки Π² Ρ„Π°ΠΉΠ»:

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ β€œfile.txt” Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ записи ("w") ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ puts для записи строк Π² Ρ„Π°ΠΉΠ»

File.open("file.txt", "w") do |file|
  file.puts "Hello, World!"
  file.puts "This is a sample file."
end

Когда ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с Ρ„Π°ΠΉΠ»ΠΎΠΌ, Π²Π°ΠΆΠ½ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΅Π³ΠΎ послС окончания ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ чтСния ΠΈΠ»ΠΈ записи. Однако, Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π²Ρ‹ΡˆΠ΅ использован Π±Π»ΠΎΠΊ do..end, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт автоматичСски Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» послС выполнСния ΠΊΠΎΠ΄Π° Π² Π±Π»ΠΎΠΊΠ΅. Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°.

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ File.read ΠΈ File.write для чтСния ΠΈ записи Ρ„Π°ΠΉΠ»ΠΎΠ² соотвСтствСнно.

# Π§Ρ‚Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ
content = File.read("file.txt")
puts content
 
# Π—Π°ΠΏΠΈΡΡŒ Π² Ρ„Π°ΠΉΠ»
File.write("file.txt", "Some content to write")

ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ошибок

Π’ Ruby ΠΌΠΎΠΆΠ½ΠΎ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова raise. Оно ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ β€” класс ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

raise "ΠŸΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ошибка"

Для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² Ruby ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ конструкция begin..rescue..ensure:

begin
  # Код, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅
rescue Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅_1
  # ДСйствия ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅_1
rescue Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅_2
  # ДСйствия ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅_2
else
  # ДСйствия ΠΏΡ€ΠΈ отсутствии ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ
ensure
  # Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполнится Π² любом случаС
end

Π’ Π±Π»ΠΎΠΊΠ΅ begin содСрТится ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Если ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π±Π»ΠΎΠΊ rescue с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Если ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, выполняСтся Π±Π»ΠΎΠΊ else. Π‘Π»ΠΎΠΊ ensure выполняСтся всСгда, нСзависимо ΠΎΡ‚ наличия ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ноль Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ZeroDivisionError, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½ΠΎ Π±Π»ΠΎΠΊΠΎΠΌ rescue, ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ сообщСниС β€œΠŸΠΎΠΉΠΌΠ°Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½ΠΎΠ»ΡŒβ€.

begin
  x = 10 / 0 # Π”Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ноль
rescue ZeroDivisionError
  puts "Поймано ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ноль"
end

Если Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ всС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊ rescue Π±Π΅Π· указания ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

begin
  # Код, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅
rescue
  # ДСйствия ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ любого ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ
end

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ классы (ООП)

ΠšΠ»Π°ΡΡΡ‹ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова class. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ вызываСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ initialize. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ инстанс класса, Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Имя_класса.new(значСния для конструктора)

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ символа @ ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² Ruby позволяСт Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒ экзСмплярной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, которая Π±ΡƒΠ΄Π΅Ρ‚ доступна Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ attr_accessor ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ‚Π΅ поля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² классС (Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡ… Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, Ссли ΠΌΡ‹ сразу Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² конструкторС)

class Person
    attr_accessor :name, :age
 
    def initialize(name, age)
      @name = name
      @age = age
    end
 
    def say_hello
      puts "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, мСня Π·ΠΎΠ²ΡƒΡ‚ #{@name} ΠΈ ΠΌΠ½Π΅ #{@age} Π»Π΅Ρ‚."
    end
  end
 
person = Person.new("Алиса", 25)
person.say_hello

НаслСдованиС, ΠΌΠΎΠ΄ΡƒΠ»ΠΈ

Класс ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ свойства ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ называСтся Β«Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌΒ» ΠΈΠ»ΠΈ «супСрклассом», ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово class ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ <

class Animal
  def speak
    puts "I can speak!"
  end
end
 
class Dog < Animal
  def bark
    puts "Woof!"
  end
end
 
dog = Dog.new
dog.speak   # I can speak!
dog.bark    # Woof!

Π˜ΠΌΠΏΠΎΡ€Ρ‚Ρ‹

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с классом

file1.rb

class ClassA
  def method_a
    puts "Hello from ClassA"
  end
end

И Π΄Π°Π»Π΅Π΅, Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ require_relative ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ Ρ„Π°ΠΉΠ» Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ модуля

file2.rb

require_relative 'file1'
 
class ClassB
  def initialize
    @instance_of_a = ClassA.new
  end
 
  def method_b
    @instance_of_a.method_a
  end
end
 
instance_of_b = ClassB.new
instance_of_b.method_b

Ruby on Rails

ΠžΡΠ½ΠΎΠ²Ρ‹, установка, структура ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ шагом Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ruby Π½Π° свой ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€. МоТно ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ установщик Ruby с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ сайта ruby-lang.org.

Π”Π°Π»Π΅Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Rails Rails:

gem install rails`

Π”Π°Π»Π΅Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

rails new myapp

И Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сСрвСр

rails server

Π Π΅Π»ΡŒΡΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠΎ самому ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ для бэкэнд-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ:

  • Π²Π΅Π±-сСрвСр ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ запрос ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
  • Π΄Π°Π»Π΅Π΅ этот запрос ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² Ρ€ΠΎΡƒΡ‚Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт, Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ запрос
  • ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ связан с Model Ρ‚Π΅Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ с View, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° связываниС ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ с ΠΈΡ… ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ ΡƒΡ…ΠΎΠ΄ΠΎΠΌ ΠΊ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ создании прилоТСния, Ρƒ нас гСнСрируСтся огромная структура:

  • app - Ρ…Ρ€Π°Π½ΠΈΡ‚ вСсь ΠΊΠΎΠ΄ прилоТСния
  • bin - Ρ…Ρ€Π°Π½ΠΈΡ‚ всС исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹
  • config - Ρ…Ρ€Π°Π½ΠΈΡ‚ routes.rb, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…Ρ€Π°Π½ΠΈΡ‚ Ρ‚Π΅ настройки, ΠΊΠ°ΠΊΠΎΠΉ Ρ€ΠΎΡƒΡ‚ ΠΊΠ°ΠΊΠΈΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ + Ρ‚Π°ΠΌ находятся ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ
  • db - Ρ‚ΡƒΡ‚ хранятся ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…
  • lib - хранятся Ρ€ΡƒΠ±ΠΈ-Ρ„Π°ΠΉΠ»Ρ‹
  • log - Π»ΠΎΠ³ΠΈ сСрвСра
  • public - Π»Π΅ΠΆΠΈΡ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ΡŒΡΡ с сСрвСра
  • storage - Ρ‚ΡƒΠ΄Π° Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ
  • test - тСсты ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ
  • tmp - Ρ‚ΡƒΡ‚ хранятся Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹
  • vendor - Ρ‚ΡƒΡ‚ хранятся Ρ„Π°ΠΉΠ»Ρ‹ внСшниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π΅ ΠΈΠ· Ρ€ΡƒΠ±ΠΈ
  • Rakefile - Ρ„Π°ΠΉΠ» с кастомными Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅
  • config.ru - Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описываСт, ΠΊΠ°ΠΊ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π΄Π°Ρ‘Ρ‚ сСрвСр Π½Π° Ρ„Ρ€ΠΎΠ½Ρ‚

Π‘ΠΎΠ²Π΅Ρ‚:

Π€Π°ΠΉΠ» .ruby-verison слСдуСт ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈ Π²Π΅Ρ€ΡΠΈΡŽ Ρ€ΡƒΠ±ΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ Gemfile Ρ‚ΠΎΠΆΠ΅ стоит ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Ρƒ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ вСрсиями Ρ€ΡƒΠ±ΠΈ

МодСли, ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ, ORM, CRUD

КаТдая модСль Ρƒ нас ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…

Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ

rails generate model User name:string registration_date:date
rails generate model Category key:string:name description:text
rails generate model Post title:string body:text category:references image:string
rails generate model Comment rating:integer body:text created_at:date post:references

ПослС создания ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ, Ρƒ нас Π² db/migrate ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΉΠ΄ΡƒΡ‚ Π½Π° сСрвСр

class CreateCategories < ActiveRecord::Migration[7.0]
  def change
    create_table :categories do |t|
      t.string :key
      t.string :name
      t.text :description
 
      t.timestamps
    end
  end
end

Π”Π°Π»Π΅Π΅ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ. ΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ структуру ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π‘Π”.