/ / Cosa contiene effettivamente `Any` in Elixir` defprotocol`? - elisir

Cosa contiene effettivamente `Any` in Elixir` defprotocol`? - elisir

Mio blank.ex è:

defprotocol Blank do
@fallback_to_any true
def blank?(data)
end

defimpl Blank, for: Any do
def blank?(_), do: false
end

e digito iex, l'output è:

iex(18)> Blank.blank? []
true
iex(19)> Blank.blank? [6]
false
iex(20)> Blank.blank? "12"
false
iex(22)> Blank.blank? "" "
true
iex(23)> Blank.blank? "elixi"
true
iex(24)> Blank.blank? {1}
true
iex(25)> Blank.blank? {1, 2}
true
iex(26)> Blank.blank? 2
false

Quindi mi chiedo cosa fa il Any significa in questo contesto? e ho ottenuto qualcosa di interessante, meteo o meno, io uso l'implementazione come questa

defimpl Blank, for: Any do
def blank?(_), do: false
end

e l'output nell'ex prima che sia lo stesso. Significa che questo implementato non fa nulla? O mi è sfuggito qualcosa?

risposte:

3 per risposta № 1

Any la clausola dovrebbe essere chiamata se non viene fornita un'implementazione.

Non so perché stai ottenendo questi strani risultati, ma ho il sospetto che tu abbia alcune definizioni errate nella sessione di shell. Ho provato con il esempio dal sito:

defprotocol Blank do
@fallback_to_any true
def blank?(data)
end

defimpl Blank, for: Integer do
def blank?(_), do: false
end

# Just empty list is blank
defimpl Blank, for: List do
def blank?([]), do: true
def blank?(_),  do: false
end

# Just the atoms false and nil are blank
defimpl Blank, for: Atom do
def blank?(false), do: true
def blank?(nil),   do: true
def blank?(_),     do: false
end

defimpl Blank, for: Any do
def blank?(_), do: false
end

E ha ottenuto risultati attesi:

iex(1)> Blank.blank? "" "
false

iex(2)> Blank.blank? "elixi"
false

iex(3)> Blank.blank? []
true

iex(4)> Blank.blank? {}  # fallback to Any
false

L'ultimo esempio è un fallback per Any, poiché il protocollo non è definito per una tupla. Se rimuovi il Any implementazione, e ricomincia la shell, dovresti ricevere un errore:

iex(1)> Blank.blank? {}
** (Protocol.UndefinedError) protocol Blank not implemented for {}

0 per risposta № 2

So qual è la mia confusione, ho anche iniziato con esempio questo sito. Innanzi tutto il mio blank.ex è

defprotocol Blank do
def blank?(data)
end

defimpl Blank, for: Integer do
def blank?(_), do: false
end

defimpl Blank, for: List do
def blank?([]), do: true
def blank?(_), do: false
end

e dopo che l'ho compilato elixirc blank.ex, creerà questi file di travi:

Elixir.Blank.Integer.beam   Elixir.Blank.List.beam   Elixir.Blank.beam

e in secondo luogo il mio blank.ex è

defprotocol Blank do
@fallback_to_any true
def blank?(data)
end

defimpl Blank, for: Any do
def blank?(_), do: true
end

e lo ricompongo di nuovo, ho ottenuto questi file di travi:

Elixir.Blank.Any.beam  Elixir.Blank.Integer.beam Elixir.Blank.List.beam Elixir.Blank.beam

Non cancella il Elixir.Blank.Integer.beam Elixir.Blank.List.beam file, e quando corro in iex:

iex(18)> Blank.blank? [] # it uses Elixir.Blank.List.beam
true
iex(19)> Blank.blank? [6] # it uses Elixir.Blank.List.beam
false
iex(20)> Blank.blank? "12" # it uses Elixir.Blank.List.beam
false
iex(22)> Blank.blank? "" " # it uses Elixir.Blank.Any.beam
true
iex(23)> Blank.blank? "elixi" # it uses Elixir.Any.List.beam
true
iex(24)> Blank.blank? {1} # it uses Elixir.Blank.Any.beam
true
iex(25)> Blank.blank? {1, 2} # it uses Elixir.Blank.Any.beam
true
iex(26)> Blank.blank? 2 # it uses Elixir.Blank.Integer.beam
false

Quindi questo è solo perché mi manca la cancellazione manuale dei vecchi file dei raggi.