Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Elixir is not Ruby, it is better

Elixir is not Ruby, it is better

Sobolev Nikita

September 23, 2017
Tweet

More Decks by Sobolev Nikita

Other Decks in Programming

Transcript

  1. О чем я расскажу • О языке Elixir и интересных

    концепциях: почему Elixir - не такой как Ruby? • О принципах построения архитектуры приложения • О том, как писать логику приложения
  2. Elixir • Функциональный динамический язык • Основан на виртуальной машине

    Erlang • Быстрый и надежный • Просто создан для асинхронных операций
  3. iex(1)> example = [1, 2, 3] [1, 2, 3] iex(2)>

    List.replace_at(example, 1, 99) [1, 99, 3] iex(3)> example [1, 2, 3] Иммутабельность
  4. • Ничего нельзя "нахачить" • Идеально подходит для асинхронных задач

    • Разные параллельные процессы используют свои копии данных
  5. iex(1)> task = Task.async(fn -> 4 + 4 end) %Task{owner:

    #PID<0.84.0>, pid: #PID<0.86.0>, ref: #Reference<>} iex(2)> Task.await(task) 8
  6. def start_link do Agent.start_link(fn -> load_values() end, name: __MODULE__) end

    def get(key) do Agent.get(__MODULE__, fn(state) -> Map.get(state, key) end) end def all do Agent.get(__MODULE__, fn(state) -> state end) end
  7. • Docker убивает половину плюсов BeamVM • Redis уступает в

    скорости ets • Nginx может быть использован, но не обязательно • (G)Unicorn совсем не нужен
  8. Enum.count(Enum.uniq([1, 2, 2, 2, 3])) # => 3 [1, 2,

    2, 2, 3] |> Enum.uniq() |> Enum.count() # => 3
  9. iex(1)> i = [1, 2, 3] [1, 2, 3] iex(2)>

    [one, two, three] = i [1, 2, 3] iex(3)> one 1 iex(4)> three 3
  10. iex(1)> {:ok, result} = {:ok, 15} {:ok, 15} iex(1)> {:ok,

    result} = {:error, "Timeout"} ** (MatchError) no match of right hand side value: {:error, "Timeout"}
  11. iex(1)> person = %{"name" => "Nikita", "job" => "developer"} %{"job"

    => "developer", "name" => "Nikita"} iex(2)> %{"name" => name} = person %{"job" => "developer", "name" => "Nikita"} iex(3)> name "Nikita"
  12. defmodule Greetings do def hello(:people), do: "Hello, people!" def hello({name,

    surname}) do "Hello, dear #{name} #{surname}" end def hello(_), do: "Hello, stranger" end
  13. case Some.fetch_data() do %{"user" => user} -> {:ok, user} %{"error"

    => reason} -> {:error, reason} _ -> {:error, "Unknown"} end
  14. defprotocol Size do @doc "Calculates the size of a data

    structure" def size(data) end defimpl Size, for: BitString do def size(string), do: byte_size(string) end defimpl Size, for: Map do def size(map), do: map_size(map) end defimpl Size, for: Tuple do def size(tuple), do: tuple_size(tuple) end
  15. defmodule Parser do @callback parse(String.t) :: any @callback extensions() ::

    [String.t] end defmodule JSONParser do @behaviour Parser def parse(str), do: # ... parse JSON def extensions, do: ["json"] end defmodule YAMLParser do @behaviour Parser def parse(str), do: # ... parse YAML def extensions, do: ["yml"] end