Elixir 스크립트, 할 수 있는 것과 할 수 없는 것
mix.exs
외부에서는 .exs
파일을 많이 다루지 않았습니다. 여러분 중 일부도 마찬가지일 것이라고 생각합니다. 그러나 최근에 필요한 상황에 직면했습니다.나는 내 엘릭서 프로젝트를 도커 컨테이너에 넣고 싶었습니다. 그래서 실행할 때 사용자 입력을 기다리는 터미널로 바로 들어갈 수 있었습니다. 입력을 한 줄씩 수집하고 빈 줄이 주어지면 해당 줄의 목록을 모두 반환합니다. 프로그램의
ENTRYPOINT
로 엘릭서 스크립트를 만드는 것이 옳은 일이라고 느꼈습니다. 그러나 나는 elixir 스크립트로 할 수 있는 것과 할 수 없는 것의 한계를 이해하기 위한 실질적인 문서 및/또는 예제를 찾기 위해 고군분투했습니다.약간의 시행 착오 끝에 나는 작동하는 몇 가지 비트를 발견하고 내 프로젝트에 사용할 수 있는 것을 얻을 때까지 거기에서 반복하기 시작했습니다. 다음은 코드가 동일한 작업을 수행하지만 형식과 레이아웃이 다른 경우의 예입니다. 참고로 터미널의 코드 스니펫을 위해 파일 이름을 지정했습니다
start.exs
.또한 나와 같은 문제를 겪었을 수 있는 다른 사람을 위해
IO.stream
( docs )을 살펴봅니다.함수를 정의할 수 있습니다!
돌이켜 보면 (항상 20/20) 이것은 의미가 있지만 어떤 이유로 든 당신이 이것을 할 수 있다는 생각이 들지 않았습니다. 일반 엘릭서 모듈과 비교했을 때 유일한 차이점은 파일 끝에서 함수를 호출한다는 것입니다.
defmodule Lines do
def run(lines \\ []) do
case IO.read(:stdio, :line) do
"\n" ->
# done reading lines!
lines
|> Enum.reverse()
|> Enum.map(&String.replace(&1, "\n", ""))
|> IO.inspect()
line ->
run([line | lines])
end
end
end
Lines.run()
$ elixir start.exs
hi
there
["hi", "there"]
아니요, 저는 제 기능이 익명인 것을 선호합니다.
어떤 이유로든 모듈이나 함수를 정의하고 싶지 않은 경우를 위한 또 다른 접근 방식이 있습니다.
IO.stream(:stdio, :line)
|> Enum.reduce_while([], fn line, lines ->
case line do
"\n" -> {:halt, lines |> Enum.reverse()}
line -> {:cont, [line | lines]}
end
end)
|> Enum.map(&String.replace(&1, "\n", ""))
|> IO.inspect()
$ elixir start.exs
hi
there
["hi", "there"]
최종 형태를 위한 시간
IO.stream(:stdio, :line)
|> Enum.take_while(&(&1 != "\n"))
|> Enum.map(&String.replace(&1, "\n", ""))
|> IO.inspect()
$ elixir start.exs
hi
there
["hi", "there"]
결론
이 기사의 요점은 코드가 아니라 전통적인 엘릭서 코드만 다룬 후에 범위 지정 문제를 해결하는 데 어려움을 겪었던 것 같습니다. 바라건대, 여러분이 비슷한 상황에 처해 있다면 원래 생각했던 것보다 더 많은 유연성이 있다는 것을 이제 알 수 있을 것입니다.
IO.stream
문서와 관련하여. 일부 수정을 위해 a PR을 만들었습니다.
Reference
이 문제에 관하여(Elixir 스크립트, 할 수 있는 것과 할 수 없는 것), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/shmink/elixir-script-what-can-and-cant-be-done-4137텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)