elixir: update
This commit is contained in:
parent
1e5aed30cb
commit
b6c5b66a00
225
elixir.md
225
elixir.md
|
@ -238,14 +238,15 @@ alias Foo.{Bar, Baz}
|
||||||
```elixir
|
```elixir
|
||||||
import String
|
import String
|
||||||
```
|
```
|
||||||
|
{: .-setup}
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
str = "hello"
|
str = "hello"
|
||||||
str |> length() #=> 5
|
str |> length() # → 5
|
||||||
str |> codepoints() #=> ["h", "e", "l", "l", "o"]
|
str |> codepoints() # → ["h", "e", "l", "l", "o"]
|
||||||
str |> slice(2..-1) #=> "llo"
|
str |> slice(2..-1) # → "llo"
|
||||||
str |> split(" ") #=> ["hello"]
|
str |> split(" ") # → ["hello"]
|
||||||
str |> capitalize() #=> "Hello"
|
str |> capitalize() # → "Hello"
|
||||||
str |> match(regex)
|
str |> match(regex)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -274,15 +275,22 @@ div(a, b) # integer division
|
||||||
```elixir
|
```elixir
|
||||||
import Float
|
import Float
|
||||||
```
|
```
|
||||||
|
{: .-setup}
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
n = 10.3
|
n = 10.3
|
||||||
n |> ceil() #=> 11.0
|
```
|
||||||
n |> ceil(2) #=> 11.30
|
{: .-setup}
|
||||||
n |> to_string() #=> "1.030000+e01"
|
|
||||||
n |> to_string([decimals: 2, compact: true])
|
|
||||||
|
|
||||||
Float.parse("34") #=> { 34.0, "" }
|
```elixir
|
||||||
|
n |> ceil() # → 11.0
|
||||||
|
n |> ceil(2) # → 11.30
|
||||||
|
n |> to_string() # → "1.030000+e01"
|
||||||
|
n |> to_string([decimals: 2, compact: true])
|
||||||
|
```
|
||||||
|
|
||||||
|
```elixir
|
||||||
|
Float.parse("34") # → { 34.0, "" }
|
||||||
```
|
```
|
||||||
|
|
||||||
### Integer
|
### Integer
|
||||||
|
@ -290,32 +298,43 @@ Float.parse("34") #=> { 34.0, "" }
|
||||||
```elixir
|
```elixir
|
||||||
import Integer
|
import Integer
|
||||||
```
|
```
|
||||||
|
{: .-setup}
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
n = 12
|
n = 12
|
||||||
n |> digits() #=> [1, 2]
|
```
|
||||||
n |> to_char_list() #=> '12'
|
{: .-setup}
|
||||||
n |> to_string() #=> "12"
|
|
||||||
|
```elixir
|
||||||
|
n |> digits() # → [1, 2]
|
||||||
|
n |> to_char_list() # → '12'
|
||||||
|
n |> to_string() # → "12"
|
||||||
n |> is_even()
|
n |> is_even()
|
||||||
n |> is_odd()
|
n |> is_odd()
|
||||||
|
```
|
||||||
|
|
||||||
|
```elixir
|
||||||
# Different base:
|
# Different base:
|
||||||
n |> digits(2) #=> [1, 1, 0, 0]
|
n |> digits(2) # → [1, 1, 0, 0]
|
||||||
n |> to_char_list(2) #=> '1100'
|
n |> to_char_list(2) # → '1100'
|
||||||
n |> to_string(2) #=> "1100"
|
n |> to_string(2) # → "1100"
|
||||||
|
```
|
||||||
|
|
||||||
parse("12") #=> 12
|
```elixir
|
||||||
undigits([1, 2]) #=> 12
|
parse("12") # → {12, ""}
|
||||||
|
undigits([1, 2]) # → 12
|
||||||
```
|
```
|
||||||
|
|
||||||
### Type casting
|
### Type casting
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
Float.parse("34.1") #=> {34.1, ""}
|
Float.parse("34.1") # → {34.1, ""}
|
||||||
Integer.parse("34") #=> {34, ""}
|
Integer.parse("34") # → {34, ""}
|
||||||
|
```
|
||||||
|
|
||||||
Float.to_string(34.1) #=> "3.4100e+01"
|
```elixir
|
||||||
Float.to_string(34.1, [decimals: 2, compact: true]) #=> "34.1"
|
Float.to_string(34.1) # → "3.4100e+01"
|
||||||
|
Float.to_string(34.1, [decimals: 2, compact: true]) # → "34.1"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Map
|
## Map
|
||||||
|
@ -323,44 +342,56 @@ Float.to_string(34.1, [decimals: 2, compact: true]) #=> "34.1"
|
||||||
### Defining
|
### Defining
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
map = %{name: "hi"} # atom keys (:name)
|
m = %{name: "hi"} # atom keys (:name)
|
||||||
map = %{"name" => "hi"} # string keys ("name")
|
m = %{"name" => "hi"} # string keys ("name")
|
||||||
```
|
```
|
||||||
|
|
||||||
### Updating
|
### Updating
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
import Map
|
import Map
|
||||||
|
```
|
||||||
|
{: .-setup}
|
||||||
|
|
||||||
map = %{map | name: "yo"} # key must exist
|
```elixir
|
||||||
|
m = %{m | name: "yo"} # key must exist
|
||||||
|
```
|
||||||
|
|
||||||
map |> put(:id, 2) #=> %{id: 2, name: "hi"}
|
```elixir
|
||||||
map |> put_new(:id, 2) # only if `id` doesn't exist (`||=`)
|
m |> put(:id, 2) # → %{id: 2, name: "hi"}
|
||||||
|
m |> put_new(:id, 2) # only if `id` doesn't exist (`||=`)
|
||||||
|
```
|
||||||
|
|
||||||
map |> put(:b, "Banana")
|
```elixir
|
||||||
map |> merge(%{b: "Banana"})
|
m |> put(:b, "Banana")
|
||||||
map |> update(:a, &(&1 + 1))
|
m |> merge(%{b: "Banana"})
|
||||||
map |> update(:a, fun a -> a + 1 end)
|
m |> update(:a, &(&1 + 1))
|
||||||
|
m |> update(:a, fun a -> a + 1 end)
|
||||||
|
```
|
||||||
|
|
||||||
{old, new} = map |> get_and_update(:a, &(&1 || "default"))
|
```elixir
|
||||||
|
m |> get_and_update(:a, &(&1 || "default"))
|
||||||
|
# → {old, new}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Deleting
|
### Deleting
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
map |> delete(:name) #=> "hi"
|
m |> delete(:name) # → %{}
|
||||||
map |> pop(:name) #=> %{id: 1}
|
m |> pop(:name) # → {"John", %{}}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Reading
|
### Reading
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
map |> get(:id) #=> 1
|
m |> get(:id) # → 1
|
||||||
map |> keys() #=> [:id, :name]
|
m |> keys() # → [:id, :name]
|
||||||
map |> values() #=> [1, "hi"]
|
m |> values() # → [1, "hi"]
|
||||||
|
```
|
||||||
|
|
||||||
map |> to_list() #=> [id: 1, name: "hi"]
|
```elixir
|
||||||
#=> [{:id, 1}, {:name, "hi"}]
|
m |> to_list() # → [id: 1, name: "hi"]
|
||||||
|
# → [{:id, 1}, {:name, "hi"}]
|
||||||
```
|
```
|
||||||
|
|
||||||
### Deep
|
### Deep
|
||||||
|
@ -368,30 +399,45 @@ map |> to_list() #=> [id: 1, name: "hi"]
|
||||||
```elixir
|
```elixir
|
||||||
put_in(map, [:b, :c], "Banana")
|
put_in(map, [:b, :c], "Banana")
|
||||||
put_in(map[:b][:c], "Banana") # via macros
|
put_in(map[:b][:c], "Banana") # via macros
|
||||||
|
```
|
||||||
|
|
||||||
|
```elixir
|
||||||
get_and_update_in(users, ["john", :age], &{&1, &1 + 1})
|
get_and_update_in(users, ["john", :age], &{&1, &1 + 1})
|
||||||
```
|
```
|
||||||
|
|
||||||
### Constructing
|
### Constructing from lists
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
Map.new([{:b, 1}, {:a, 2}])
|
Map.new([{:b, 1}, {:a, 2}])
|
||||||
Map.new([a: 1, b: 2])
|
Map.new([a: 1, b: 2])
|
||||||
Map.new([:a, :b], fn x -> {x, x} end) #=> %{a: :a, b: :b}
|
Map.new([:a, :b], fn x -> {x, x} end) # → %{a: :a, b: :b}
|
||||||
```
|
```
|
||||||
|
|
||||||
## List
|
## List
|
||||||
|
|
||||||
```js
|
```elixir
|
||||||
import List
|
import List
|
||||||
list = [ 1, 2, 3, 4 ]
|
```
|
||||||
list = list ++ [5] # push (append)
|
{: .-setup}
|
||||||
list = [ 0 | list ] # unshift (prepend)
|
|
||||||
|
|
||||||
first(list)
|
```elixir
|
||||||
last(list)
|
l = [ 1, 2, 3, 4 ]
|
||||||
|
```
|
||||||
|
{: .-setup}
|
||||||
|
|
||||||
flatten(list)
|
```elixir
|
||||||
flatten(list, tail)
|
l = l ++ [5] # push (append)
|
||||||
|
l = [ 0 | list ] # unshift (prepend)
|
||||||
|
```
|
||||||
|
|
||||||
|
```elixir
|
||||||
|
l |> first()
|
||||||
|
l |> last()
|
||||||
|
```
|
||||||
|
|
||||||
|
```elixir
|
||||||
|
l |> flatten()
|
||||||
|
l |> flatten(tail)
|
||||||
```
|
```
|
||||||
|
|
||||||
Also see [Enum](#enum).
|
Also see [Enum](#enum).
|
||||||
|
@ -399,37 +445,64 @@ Also see [Enum](#enum).
|
||||||
|
|
||||||
## Enum
|
## Enum
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
import Enum
|
import Enum
|
||||||
|
```
|
||||||
|
{: .-setup}
|
||||||
|
|
||||||
# High-order
|
```elixir
|
||||||
reduce(list, acc, fn)
|
|
||||||
map(list, fn)
|
|
||||||
reject(list, fn)
|
|
||||||
any?(list, fn)
|
|
||||||
empty?(list, fn)
|
|
||||||
|
|
||||||
list = [:a, :b, :c]
|
list = [:a, :b, :c]
|
||||||
at(list, 0) #=> :a
|
```
|
||||||
count(list) #=> 3
|
{: .-setup}
|
||||||
empty?(list) #=> false
|
|
||||||
any?(list) #=> true
|
|
||||||
|
|
||||||
concat(list, [:d]) #=> [:d]
|
```elixir
|
||||||
|
list |> at(0) # → :a
|
||||||
|
list |> count() # → 3
|
||||||
|
list |> empty?() # → false
|
||||||
|
list |> any?() # → true
|
||||||
|
```
|
||||||
|
|
||||||
|
```elixir
|
||||||
|
list |> concat([:d]) # → [:d]
|
||||||
```
|
```
|
||||||
|
|
||||||
Also, consider streams instead.
|
Also, consider streams instead.
|
||||||
|
|
||||||
## Tuples
|
### Map/reduce
|
||||||
|
|
||||||
|
```elixir
|
||||||
|
list |> reduce(fn)
|
||||||
|
list |> reduce(acc, fn)
|
||||||
|
list |> map(fn)
|
||||||
|
list |> reject(fn)
|
||||||
|
list |> any?(fn)
|
||||||
|
list |> empty?(fn)
|
||||||
|
```
|
||||||
|
|
||||||
|
```elixir
|
||||||
|
[1, 2, 3, 4]
|
||||||
|
|> Enum.reduce(0, fn(x, acc) -> x + acc end)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tuple
|
||||||
|
|
||||||
### Tuples
|
### Tuples
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
tuple = { :a, :b }
|
import Tuple
|
||||||
|
```
|
||||||
|
{: .-setup}
|
||||||
|
|
||||||
tuple |> elem(1) # like tuple[1]
|
```elixir
|
||||||
tuple |> put_elem(index, value)
|
t = { :a, :b }
|
||||||
tuple |> tuple_size()
|
```
|
||||||
|
|
||||||
|
```elixir
|
||||||
|
t |> elem(1) # like tuple[1]
|
||||||
|
t |> put_elem(index, value)
|
||||||
|
t |> tuple_size()
|
||||||
```
|
```
|
||||||
|
|
||||||
### Keyword lists
|
### Keyword lists
|
||||||
|
@ -437,10 +510,12 @@ tuple |> tuple_size()
|
||||||
```elixir
|
```elixir
|
||||||
list = [{ :name, "John" }, { :age, 15 }]
|
list = [{ :name, "John" }, { :age, 15 }]
|
||||||
list[:name]
|
list[:name]
|
||||||
|
```
|
||||||
|
|
||||||
# For string-indexed keyword lists
|
```elixir
|
||||||
|
# For string-keyed keyword lists
|
||||||
list = [{"size", 2}, {"type", "shoe"}]
|
list = [{"size", 2}, {"type", "shoe"}]
|
||||||
List.keyfind(list, "size", 0) #=> {"size", 2}
|
List.keyfind(list, "size", 0) # → {"size", 2}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Functions
|
## Functions
|
||||||
|
@ -488,7 +563,7 @@ end
|
||||||
|
|
||||||
%User{name: "John", age: 20}
|
%User{name: "John", age: 20}
|
||||||
|
|
||||||
%User{}.struct #=> User
|
%User{}.struct # → User
|
||||||
```
|
```
|
||||||
|
|
||||||
See: [Structs](http://elixir-lang.org/getting-started/structs.html)
|
See: [Structs](http://elixir-lang.org/getting-started/structs.html)
|
||||||
|
@ -510,7 +585,7 @@ defimpl Blank, for: List do
|
||||||
def blank?(_), do: false
|
def blank?(_), do: false
|
||||||
end
|
end
|
||||||
|
|
||||||
Blank.blank?([]) #=> true
|
Blank.blank?([]) # → true
|
||||||
```
|
```
|
||||||
|
|
||||||
### Any
|
### Any
|
||||||
|
@ -536,8 +611,14 @@ end
|
||||||
```elixir
|
```elixir
|
||||||
for n <- [1, 2, 3, 4], do: n * n
|
for n <- [1, 2, 3, 4], do: n * n
|
||||||
for n <- 1..4, do: n * n
|
for n <- 1..4, do: n * n
|
||||||
|
```
|
||||||
|
|
||||||
for {key, val} <- %{a: 10, b: 20}, do: val #=> [10, 20]
|
```elixir
|
||||||
|
for {key, val} <- %{a: 10, b: 20}, do: val
|
||||||
|
# → [10, 20]
|
||||||
|
```
|
||||||
|
|
||||||
|
```elixir
|
||||||
for {key, val} <- %{a: 10, b: 20}, into: %{}, do: {key, val*val}
|
for {key, val} <- %{a: 10, b: 20}, into: %{}, do: {key, val*val}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -545,7 +626,7 @@ for {key, val} <- %{a: 10, b: 20}, into: %{}, do: {key, val*val}
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
for n <- 1..10, rem(n, 2) == 0, do: n
|
for n <- 1..10, rem(n, 2) == 0, do: n
|
||||||
#=> [2, 4, 6, 8, 10]
|
# → [2, 4, 6, 8, 10]
|
||||||
```
|
```
|
||||||
|
|
||||||
### Complex
|
### Complex
|
||||||
|
|
Loading…
Reference in New Issue