이 장에서 살펴볼 내용은 세가지다
1.익명함수
2.함수에서의 패턴매칭
3.파이프연산자
---
1.익명함수
엘릭서는 fn키워드로 익명함수를 만들 수 있다
fn
parameter-list -> body
parameter-list -> body ...
end
fn...end를 문자열을 감싸는 따옴표같은것이라고 여기되
문자열대신 함수를 반환하는 문법이라고 생각하면 된다
이렇게 만든 함수는 다른함수에 전달하거나 인자를넣어 호출할 수 있다
> sum = fn (a, b) -> a + b end
> sum.(1, 2)
3
익명함수는 온점을 사용해 함수를 호출하고 괄호안에 인자를 넣어 전달할 수 있다
또한 익명함수에서는 함수가 인자를 받지않더라도 괄호를 사용해 호출해야한다
기명함수는 온점을 사용하지 않고 괄호를 생략할 수 있다
---
2.함수에서의 패턴매칭
sum.(2,3)을 호출하면 2를 a에 할당하고 3을 b에 할당한다는것을 예상할 수 있지만
엘릭서에는 할당문이 없고 문법규칙을 통해 값을 패턴에 매칭하려고 한다
튜플의 두 값을 바꾸는 함수를 작성한다면
> swap = fn {a, b} -> {b, a} end
> swap.({6, 8})
{8, 6}
이렇게 사용할 수 있다
동일한 함수는 항상 파라미터의 개수는 같아야 하고
인자의 타입과 내용에 따라 여러 구현을 정의할 수 있는데
어떤 구현을 실행할지는 기본적으로 패턴매칭을 통해 결정된다
예를들어
파일을 열었을때 성공 여부에 따라 다른 일을 하는 함수를 작성한다고 하면
> handle_open = fn
{:ok, file} -> "Read data: #{IO.read(file, :line)}"
{_, error} -> "Error: #{:file.format_error(error)}
end
> handle_open.(File.open("code/intro/hello.exs")) # 존재하는 파일인 경우
"Read data: IO.puts \"Hello, World!\""
> handle_open.(File.open("nonexist")) # 존재하지않는 파일인 경우
"Error: no such file or directory"
이렇게 작성할 수 있다
---
3.파이프연산자
함수들을 여러개 연결해서 실행할 수 있다
>"Elixir rocks" |> String.upcase() |> String.split()
>["ELIXIR", "ROCKS"]
댓글 0