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
It doesn’t seem to be. File.ls! returns a list.
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.







