forked from alexeygritsenko/Scala-Lections
-
Notifications
You must be signed in to change notification settings - Fork 0
/
lec02.scala
119 lines (105 loc) · 5.67 KB
/
lec02.scala
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
// Не интерпретируется ESC-последовательность
row"строка"
// Интерполяционная строка:
// s"
// в строку можно включать вычислимые выражение
val x = 5
s"x=$x" // Строка будет равна 5
// Всё что в скобках будет вычислено как значение
s"2*x=${2*x}"
// Также можно писать любой код, вызов объекта и т.д.
// Можно также придумывать свои модификатор (как s, row)
// Длина строки
"".length
// Если в строке записано регулярное выражение, то оно вычиляется
"".r
// Стандартный split, но если аргумент char, то будет служить как разделитель/и
"".split(c:char)
// и аналогично string
"".split(s:string)
// split возвращает массивы строк
// Стоит заметить, что второй аргумент - это end, а не length
"".substring(start:Int)
"".substring(start:Int, end:Int)
// Будут включены 5,6,7 символ
"".substring(5,8)
// Индексация ("[n]") пишется круглыми скобками
str(2) // 3 символ в строке
// Идентификатором может быть:
// 1) То, что мы привыкли: начинается с буквы или подчеркивание и дальше следует последовательность символов/цифр;
// 2) Любой набор операторных символов; # + - ! < > * / ~ = : ? плюс Sm So наборы (>= - правильный идентификатор)
// 3) Составлен по первому правилу и по второму, но мешать нельзя
// <1>_<2>
// a_+
// +_a - нельзя
// 4) Правильным идентификатором является любая строка, заключенаня в одинарные кавычки
// 'Привет мир'
// Не может быть правильным идентификатором:
// # - нельзя, но ## можно
// <%
// :>
// <:
// ()
// []
// {}
// ,
// ;
// ...
// Рабочий (не рекомендуемый) пример:
val ++ = 2
val +++ = 3
val z = ++ + +++
// ===
// Если есть объект с вызовом метода с 1 аргументом,
x.method(y)
// то это можно записать так
x method y
// Это нужно для следующего:
// + - это метод
(2).+(3) // == 5
2 + 3
// Операторов тут как таковых нету, операции - это методы
// ===
x.op(y)
x op y
y.op(x)
// Если имя идентификатора заканчивается на :, то объект y это параметр x
x + y => x.+(y)
x + :y => y.+:(x)
// Небольшая вырезка
// Последняя часть может быть не понятна (объяснение когда-нибудь потом)
readline split ' ' map {_.toInt}
(((readline) split ' ') map {_.toInt})
// ===
// Типы
// Для массивов нету такого понятия как массив, поэтому нету [], ()
Array[Int] // Это обобщенный тип
val arr:Array[Int] = new Array[Int](4)
val arr = Array.ofDim[Int](4) // 4 строки
val arr = Array.ofDim[Int](4,5) // 4 строки, 5 столбцов
// Ключевого слова new нету!
val arr = Array(2, x+1, 5) // Одномерный массив из трех элементов
val arr = Array(Array(1,2),Array(3,4)) // Двумерный массив из 4-х элементов
// Массив идущих подряд символов от start до end не включительно
val arr = Array.range(start, end)
// Загуглить эти два метода
val arr = Array.iterate //вызов iterate(start, len)(f)
//iterate - Returns an array containing repeated applications of a function to a start value.
val arr = Array.tabulate // Мощь!!!
//tabulate - Returns an array containing values of a given function over a range of integer values starting from 0.
// Заполнить каким-то значением (например, массив двоек)
val arr = Array.fill
// В Scala есть такой верхний тип, как Any
// Например, с помощью него можно сделать один массив из строки, double, Int и т.д.
// От него есть два наследника AnyVal (значащие типы) и AnyRef (ссылочные типы)
// От AnyVal дохрена наследников
// От AnyRef есть два наследника (их не увидеть)
// ScalaObject - неявный родитель всех объектных типов
// и он также является родителем для всех классов JDK и String
// Также для AnyVal можно написать своего наследника
// Для AnyRef есть также неявный наследник, называющийся null (значение) типа Null (тип)
// его экземпляр совместим с любой ссылкой
// Nothing является наследником AnyVal и AnyRef (он ниже, чем всё что вышенаписанное)
// Очень много всего для коллекций (массивы, списки и т.д.), пример:
.head // первый элемент коллекции //голова
.tail // все остальные //хвост