-
Notifications
You must be signed in to change notification settings - Fork 0
/
day3.rb
167 lines (132 loc) · 5.26 KB
/
day3.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# Exceptions
=begin
Механізм обробки помилок
=end
# raise - Виведення останнього виключення
# raise "Error" - Runtime Error(тип помилки) і повідомлення з текстом Error
# raise ArgumentError - Argument Error
# raise ArgumentError, "Error" - Argument Error і повідомлення з текстом Error
# raise ArgumentError.new("Error") - Альтернативний запис попереднього прикладу
# raise ArgumentError, "Error", caller[0] - В даному виводі помилки додається інформація виду "filename:line" "filename:line:in'method'" яка зберігається в масиві caller
# rescue
=begin
Обробник виводу помилок в блоці програми
=end
begin
# Код при виконанні якого може відбутися помилка
rescue TypeError
puts TypeError
else
puts "Other Errors"
end
# retry
=begin
Дозволяє повернутися до початку блоку виконання в разі помилки
=end
begin
# Код при виконанні якого може відбутися помилка
rescue TypeError
puts TypeError
retry
end
# ensure
=begin
Обробник виводу помилок в блоці програми
=end
begin
# Код при виконанні якого може відбутися помилка
rescue TypeError
puts TypeError
ensure
puts "Program Finished"
end
# Objects
=begin
В Ruby фактично всі сунтності є об'єктами.
Тому робота програми складається з виклику різних методів.
Крім того кожен об'єкт є примірником якого-небедь класу.
=end
puts "#{3.succ}"
puts "#{"abc".upcase}"
puts "#{[2,1,3,6,5,4].sort}"
# someObject.someMethod
puts "#{"abc".class}"
puts "#{"abc".class.class}"
# object id
=begin
Кожен обєкт в Ruby крім інкапсуляції й власних атрибутів і операцій має унікальний ідентифікатор
=end
puts "id: #{"abc".object_id}"
# Classes
# Створення обєктів з явним заданням класу
myFile = File.new("textfile.txt", "w")
puts myFile
myString = String.new("This is a String")
puts myString
# Створення обєктів для яких непотрібно задавати клас явно
yourString = "This is a new String"
puts yourString
myNumber = 5
puts myNumber
=begin
При присвоюванні посилання на обєкт узагальнюються і два обєкти ссилаються на один і той же клас
=end
p = "123456"
r = p
puts r
puts p.object_id
puts r.object_id
=begin
Якщо об'єкт можна змінювати то модифікація початкової змінної вплине на іншу.
=end
p.gsub!(/12/, "x")
puts r
=begin
Але нове присвоєння будь якої із змінних не впливає на іншу
=end
p = "abcdef"
puts p
puts r
=begin
Для того, щоб зробити об'єкт не змінним до нього треба використати метод freeze
=end
p.freeze
# p.gsub!(/ab/, 'p') - Помилка
# Символ
=begin
Веде себе як незмінна строка і всі входження символа посилаються на одне і те ж значення
=end
suits = [:hearts, :clubs, :diamonds, :spades]
lead = suits[1].to_s
puts lead
# Масив символів
suits = %i[hearts clubs diamonds spades]
lead = suits[1].to_s
puts lead
# Object
=begin
Суперклас який доступний глобально і додані в нього з Kernel методи є загальнодоступними.
Модуль - набір методів і констант є зовнішнім по відношенню до програми Ruby. Використовується для керування простором імен.
Якщо модуль використовувати з допомогою директиви include то він будеяк клас-домішка.
Модуль в Ruby - обяєктно-орієнтована абстракція схожа на клас.
=end
puts Math::PI
# Include
=begin
Включає імена з вказаного простору імен в даний.
Тобто при використанні include тобто методи модуля стають доступні як методи примірника
=end
# Extend
=begin
Добавляє об'єкту функції з модуля.
Тобто при використанні include тобто методи модуля стають доступні як методи класу
=end
# Операції які не відносяться до модулів а лише до вихідних двійкових файлів
# Load
=begin
Читає і виконує його в даному контексті
=end
# Require
=begin
Працює аналогічно, але порівняно з load не завантажує файл якщо вінбув завантажений раніше.
=end