donnieparka
Function call expecting list works with a tuple
defmodule Navigator do
def navigate(dir) do
expanded_dir = Path.expand(dir)
go_through([expanded_dir])
end
def go_through([]), do: nil
def go_through([content | rest]) do
print_and_navigate(content, File.dir?(content))
go_through(rest)
end
def print_and_navigate(_dir, false), do: nil
def print_and_navigate(dir, true) do
IO.puts(dir)
children_dirs = File.ls!(dir)
go_through(expand_dirs(children_dirs, dir))
end
def expand_dirs([], relativeto), do: []
def expand_dirs([dir | dirs], relative_to) do
expanded_dir = Path.expand(dir, relative_to)
[expanded_dir | expand_dirs(dirs, relative_to)]
end
end
in:
def print_and_navigate(dir, true) do
IO.puts(dir)
children_dirs = File.ls!(dir)
go_through(expand_dirs(children_dirs, dir))
end
children_dirs is a tuple and expand_dirs expects a list so why do i not get an error? do functions pattern match incoming arguments before throwing errors of arguments compatibility? where can i read more about where and when pattern matching happens?
Marked As Solved
dimitarvp
Also Liked
LostKobrakai
The problem is more that not just behaviour around errors changes, but also around successes.
{:ok, result}becomes the unwrapedresult{:error, error}becomes the error being raised
This is such a common convention it is even documented: Naming conventions — Elixir v1.18.2
But in the docs for this function it’s not really explained well.
dimitarvp
What is confusing? You are using the so-called bang function – File.ls! – that does not return tuples; it either returns the values you requested, or raises a runtime error.
You seem to be mistaking it for the non-bang function – File.ls.
Check the @specs more closely.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #hex










