-
Notifications
You must be signed in to change notification settings - Fork 2
/
lesson_three.rb
155 lines (127 loc) · 5.26 KB
/
lesson_three.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
# array
# numeric_array = [4, 8, 15, 16, 23, 42]
# mixed_array = [nil, 42, 'string', true]
# human = ['Nikita', 13, 'Odessa', 'm']
# puts human[2]
# hash
# Hash - класс в Ruby (тип данных) для хранения набора уникальных ключей
# и соответствующих этим ключам значений.
# ключи следует делать двух типов: строка или символ
# соответствующее значение может быть любого типа
# human = {
# name: 'Nikita',
# age: 13,
# address: 'Odessa',
# gender: 'm'
# }
# puts human[:name] # => 'Nikita'
# puts human[:address] # => 'Odessa'
# human[:age] = 14
# human[:edu] = '111'
# puts human
#
# puts human[:work] # => nil
# baby = {}
# puts baby
#
# it_symbol = :hello
string_human = {
'name' => 'Nikita',
'age' => 13,
'address' => 'Odessa',
'gender' => 'm'
}
# puts string_human
# puts string_human['name']
# could be used to shorten the programmer's input #we_are_lazy
string_human['age'] += 1 # string_human['age'] = string_human['age'] + 1
# инициируем пустой хеш (пустое хранилище набора ключ-значение)
# в нем пока нет ни одной пары (ключ-значение), а потому обращение по любому
# ключу (не важно, строка или символ) будет возвращать nil
res = {} # Hash.new
# забираем пользовательский ввод
# example = gets.chomp
#
# # разбиваем строку посимвольно с помощью метода split
# # мы передаем в этот метод _строку-разделитель_ который определяет как разбить
# # строку и превратить ее в массив (например, '' [пустая строка] разобьет посимвольно)
# # мы проходим по каждому символу
# example.split('').each do |char|
# # если char уже встречается в качестве ключа, то мы модифицируем значение прибавляя единицу
# # если нет, то res[char] == nil и мы впервые указываем первичное значение (1)
# if res[char].nil?
# res[char] = 1
# else
# res[char] += 1
# end
# end
# данный пример собирает количество вхождений символов в строку
# puts res
# str = String.new
# str = 'hello'
# puts str.length
# класс - это своего рода "шаблон" для пока несуществующих объектов
# в нем мы можем определить каркас свойств и поведения объектов
# для определения классов используется ключевое слово class
class Cat
# initialize - это специальное (!) название для метода который срабатывает
# во время вызова ClassName.new (с соответствующими аргументами передающимися в метод)
def initialize(name = 'no name') # можно передавать аргументы как в обычный метод
# переменные которые имеют @ перед названием называются свойствами объекта
# мы не можем обратиться к ним без инициализации
@name = name
@voice = 'meow!'
end
# в теле класса можно определять другие методы (объекта)
# их можно будет вызывать у любого созданного (инициализированного) объекта
def speak
puts @voice
end
def call
# в методах мы можем использовать, менять и создавать новые свойства объекта
puts "#{@name}, come here!"
end
end
# пример инициализации объекта
my_cat = Cat.new('Ginger')
another_cat = Cat.new('Muusya')
wild_cat = Cat.new # => `no name`
#
# puts my_cat
# # puts another_cat
#
# my_cat.call
# another_cat.call
class Human
# attr_* - это сокращение (синтаксический сахар)
# который открывает доступ к чтению и/или изменению свойств
attr_reader :cat, :name
# def cat
# @cat
# end
attr_writer :cat
# def cat=(cat)
# @cat = cat
# end
# attr_accessor :cat
# сокращенная запись от
# attr_reader :cat
# attr_writer :cat
def initialize(name, cat)
@name = name
@cat = cat
end
def cat_call
@cat.call
end
end
# можно передавать как значения, так и переменные (и даже другие объекты!)
human = Human.new('Nikita', my_cat)
# переопределение свойства объекта
human.cat = another_cat
# вызов метода объекта
human.cat_call
# обращение (чтение) свойства объекта
puts human.name
words = ['apple', 'word', 'world', 'cat', 'silence']
puts words.sample