Ruby
Установка: apt install ruby-full
rbenv -
Все объекты. Без аргументов функция не требует наличия скобок. Доступа к свойствам объекта нет, через методы. Динамическое типизирование.
1.class # Выводит класс объекта, в данном случае Fixnum
Целые числа
| 3.times {print "r"} | повтор действия 3 раза |
| 1.upto(9) { |x| print x } | вывод 123456789 |
Массивы (аналог списков python)
a[1] - обращение к 1 элементу массива.
a = [3, 2, 1]
a.each do |elt|
print elt + 1
end
| a.each | Для каждого элемента |
| a,map {} | Изменение массива по правилам.
|
| a.select | выбор элементов в соответствии с правилами.
|
Хэши Аналог словарей в python.
h = {
:one => 1,
:two => 2
}
h[:one]
h.each do |key, value|
print "#{value} у ключа #{key} " # выведет 1 у ключа one 2 у ключа two
end
Методы
|
puts |
Вывод значений |
|
|
Операторы
x = 1
x, y = 1, 2
x += 1
1..3 # набор значений от 1 до 3
1...3 # набор значений от 1 до 2
generation = case birthyear
when 1946..1963: "Поколение 1"
else nil
end
# Регулярки
def areyoushure?
while true
print "Вы уверены"
response = gets
case response
when /^[Yy]/
return true
when /^Nn/, /^$/
return false
end
end
end
Классы
Все классы расширяемы внутри приложения.
Методы (функции) Если это вне класса, то глобальная функция. Возвращает последнее вычисляемое значение.
def square(x)
x*x
end
def multireturn
x, y = 1,2
[x, y]
end
Префиксы и постфиксы. Вроде упрощает язык, но походу тоже хуета.
Глобальные переменные - префикс $. переменные объекта - @, переменные класса - @@
Если имя метода заканчивается на равно, то можно использовать синтаксис
# некий класс, в котором есть метод x= и нужно туда передать значение 1
o.x=(1) # как оно обычно вызывается
o.x = 1 # так тоже можно. Типа крутая фича. Закрыли свойства, зато сделали ЭТО
На знак вопроса - возвращается только булево значение
На восклицательный знак - метод меняет объект. Например метод .sort массива возвращает отсортированный массив, тогда как метод .sort! сортирует существующий объект.
Синглтоны - методы, добавляемые к существующему классу или единичному объекту. (Ебанутая херня, хотя позиционируется как ключевая).
def Math.square(x)
x*x
end
Описание класса
Пример класса, создающего элементы с шагом.
class Sequence
include Enumerable
def initialize(from, to, delta)
@from, @to, @delta = from, to, delta
end
def each
x = @from
while x <= @to
yield x
x += @delta
end
end
def length
return 0 if @from > @to
Integer((@to - @from)/@delta) + 1)
end
alias size length # алиас на метод size
def [](index) # переопределение метода получения доступа к элементам массива
return nil if index < 0
v = @from + index * @delta
if v <= @to
v
else
nil
end
end
def *(factor) # переопределение операции умножения над объектом
Sequence.new(@from*factor, @to*factor, @delta*factor)
end
Модули
Набор функций.
module Sequence
def self.fromtoby(from, to, delta)
x = from
while x <= by
yield x
x += delta
end
end
end