Сегодня выходит наш первый пост в новой продолжающейся серии под названием Ruby Coloured Glasses . Цель этой серии — кратко изучить интересные предметы вне сообщества Ruby. Эти предметы могли влиять или находились под влиянием Руби. Здесь, в Rubysource, мы считаем важным осмотреться и посмотреть, чему мы можем научиться у других сообществ. Наслаждаться.
Одна из самых приятных вещей в Ruby — это элегантный синтаксис и удобство для разработчиков. Так как же подходит Эрланг? Оказывается, блестящее бразильское имя Хосе Валим решил посмотреть на Эрланга сквозь цветные очки Руби.
Несмотря на то, что ему 25 лет, Erlang обладает некоторыми интересными характеристиками, которые характерны для современных блогов:
- функциональный язык
- динамическая типизация
- сильная поддержка параллелизма
Конечно, есть и другие, но я оставлю это на ваше усмотрение, чтобы узнать больше об Эрланге. В этой статье я собираюсь познакомить вас с эликсиром.
Эликсир
Хосе является лауреатом премии Rubyist и решил посвятить некоторое время изучению других языков программирования, включая Erlang. После игры вокруг, Хосе решил создать свой собственный язык, надмножество эрланга по имени Эликсир . Его описание на GitHub кратко описывает его как предоставление,
Очаровательный синтаксис, диспетчеризация методов и метапрограммирование поверх Erlang VM
Со времени первого коммита GitHub в январе 2011 года было выпущено три релиза (текущая версия 0.3.0 ). Хотя это еще рано, я думаю, что стоит изучить другие языки программирования, особенно те, которые знакомы с разработчиками Ruby.
В следующих разделах я познакомлю вас с основными понятиями, такими как типы, операторы и функции, и предоставлю сравнение с Ruby, где это необходимо.
Типы
В Elixir есть несколько базовых типов, которые являются ключевыми для языка и по большей части удобно соотносятся с типами Ruby.
чисел
Целые числа и числа с плавающей запятой — это единственные типы чисел, предоставляемые Elixir, тогда как Ruby имеет пять типов чисел: Integer, Fixnum, Bignum, Float и Rational. Все типичные арифметические операторы работают как положено:
3 + 2 % => 5
2 - 1 % => 1
3 * 3 % => 9
6 / 3 % => 2.0
6 / 4 % => 1.5
%
Все, вероятно, выглядит нормально, за одним исключением: почему результат 6/3 в плавающей точке? Получается, что Эрланг всегда возвращает поплавки при выполнении деления . Если вы хотите выполнить целочисленное деление, вы должны использовать оператор 6 / 3
div
rem
6 div 3 % => 2
7 rem 2 % => 1
Еще одна интересная особенность — это диспетчеризация методов для типов данных, очень похожих на Ruby:
5.+ 3 % => 8
Вышеприведенный фрагмент будет работать в Elixir и Ruby, довольно мило, верно?
атомы
Если вы знакомы с символами в Ruby, то атомы уже вылизаны. Атомы — это литералы, значения которых равны их имени, которые также не являются сборщиком мусора (что является аналогичным поведением в Ruby и Erlang).
'functional
'Functional
'so_very_functional
'"hello windows users"
Булевы
true
false
Вы ожидали чего-то еще? Ну, под покровом значения на самом деле атомы 'true
'false
Это звучит немного многословно и не соответствует цели Elixir по предоставлению «очаровательного синтаксиса», так что вы можете просто использовать true
false
Кортеж
Кортежи эквивалентны неизменяемому массиву фиксированного размера.
x = {1, 2, 3}
x.length % => 3
x.set 0, 7 % => {7, 2, 3}
x % => {1, 2, 3}
Обратите внимание, что после создания Tuple
Предоставляется метод set
В Ruby ближе всего будет замороженный Array
x = [1, 2, 3]
x.freeze
x[0] = 5 # RuntimeError: can't modify frozen array
Списки
Списки в Elixir очень похожи на Arrays в Ruby, они могут содержать что угодно. На самом деле они имеют очень общий API, посмотрите некоторые примеры Elixir:
x = [1, 2, 3]
x.length % => 3
x.map do(val) % => [3, 6, 9]
val * 3
end
x.any? do (val) % => true
val > 2
end
Как вы решаете, использовать ли список или кортеж? Кортеж лучше всего подходит для ситуаций, когда вы не планируете обновлять элементы. Это связано с тем, что элементы кортежа хранятся в памяти непрерывно, что приводит к необходимости перераспределять все пространство в памяти при выполнении обновления (хотя это обеспечивает действительно быстрый доступ).
С другой стороны, списки легко обновляются и повторяются, потому что они реализованы как связанные списки. Хосе привел мне пример того, когда кортежи могут подходить:
Например, если вы извлекаете данные из базы данных в Erlang, вы должны вернуть список кортежей, где каждый кортеж содержит информацию о каждой записи (кортеж для каждой строки) и все кортежи в списке.
Для получения дополнительной информации проверьте список источников.
Заказанный Дикт
Как вы уже догадались, OrderedDict
Hash
Это отображение пар ключ-значение, которые упорядочены. Однако, в отличие от Ruby, ключи упорядочиваются не путем вставки, а с использованием правил упорядочения Erlang.
x = {1: 'a, 5: 'e, 3: 'c}
x.key? 1 % => true
x.key? 9 % => false
Струны
Строки обрабатываются как двоичные файлы UTF-8. Что это обозначает? Хорошо, Elixir хранит строки в виде двоичных файлов, где каждый символ представлен от 1 до 4 байтов. Ruby 1.9, с другой стороны, решил обеспечить большую гибкость при кодировании строк. Строка может быть преобразована между списками символов и строкой с помощью to_char_list
to_bin
x = "hello"
x.to_char_list % => [104, 101, 108, 108, 111]
[104, 101, 108, 108, 111].to_bin % => "hello"
Если этот бинарный материал вас заинтриговал, стоит прочитать больше на сайте документации Erlangs.
операторы
В Elixir есть много общих операторов, которые вы привыкли видеть, но есть несколько интересных функций. Я быстро перечислю их все и выделю интересные.
Срок
Доступны все стандартные операторы термина: ==
!=
<=
<
>=
>
Однако есть два дополнительных оператора, которые могут быть новыми для вас, если, возможно, вы не использовали JavaScript: ===
!==
Эти два оператора предоставляют возможность проверить, являются ли два значения точно равными или точно не равными друг другу.
1 == 1 % => true
1 === 1 % => true
1 === 1.0 % => false
Обратите внимание, что 1
1.0
арифметика
Опять не много нового здесь: +
-
*
/
Однако, если вы хотите выполнить целочисленное деление или получить модуль по модулю, вы можете использовать операторы div
rem
4 div 2 % => 2
5 rem 2 % => 1
Есть и другие операторы, такие как логические и побитовые, которые очень похожи на Ruby .
функции
Естественно, функции играют главную роль в эликсире, в конце концов, это функциональный язык. Функции можно создавать с помощью do
->
lambda
sum = do(x, y)
x + y
end
sum.call 1, 3 % => 4
sum.apply([1,3]) % => 4
sum[4, 2] % => 6
sum.(9, 1) % => 10
[1, 2, 3, 4].map -> (val) val * 2 % => [2, 4, 6, 8]
В приведенном выше коде вы можете увидеть, что есть несколько способов вызвать функцию. Для тех, кто знаком с JavaScript, вы узнаете call
apply
Еще один полезный трюк, предоставляемый Elixir, — анонимные функции. Например, если бы я хотел получить длину каждой строки в списке, я мог бы сделать это:
strings = ["hello", "everyone", "reading", "this"]
strings.map do (val) % => [5, 8, 7, 4]
val.length
end
% or a bit simpler
strings.map -> (val) val.length % => [5, 8, 7, 4]
Как видите, я просто называю длину каждого элемента в списке. Используя анонимную функцию, я могу упростить ее еще больше:
strings.map _.length % => [5, 8, 7, 4]
Довольно мило, правда? Это оно? Конечно, нет. Функции могут быть переданы в качестве аргументов:
sum = -> (a, b) a + b
double_sum = -> (f, a, b) f.call(a, b) * 2
double_sum.(sum, 5, 3) % => 16
Конечно, можно узнать больше о функциях, особенно читая источник .
следующий
Я только поцарапал поверхность здесь и, надеюсь, дал вам достаточно вкуса, чтобы соблазнить вас исследовать больше самостоятельно. Elixir активно разрабатывается, регулярно появляются новые функции и исправления ошибок. Ниже перечислены некоторые области, которые стоит изучить:
- сопоставление с образцом
- исключения
- вызывая методы erlang
Пожалуйста, оставляйте отзывы о своих мыслях и открытиях, если что-то здорово, что вы уделяете время изучению языков за пределами Ruby.