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

Transcript

57 slides
  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

More Decks by Sobolev Nikita

Other Decks in Programming