Size: a a a

2020 March 25

PG

Pïg Grëënëst in pro.elixir
def add_optional(query, condition) do
 if condition do
   select_merge(query, [x], %{optional: x.optional})
 else
   select_merge(query, [_x], %{optional: nil})
 end
end
источник

PG

Pïg Grëënëst in pro.elixir
что-то типа такого
источник

V

V in pro.elixir
Котаны, можно ли в эликсире указать протокол в спеке? Например
defprotocol Utility do
 @spec type(t) :: String.t()
 def type(value)
end

defimpl Utility, for: BitString do
 def type(_value), do: "string"
end

defimpl Utility, for: Integer do
 def type(_value), do: "integer"
end

defmodule Some do
 @spec get_utility :: ??? (как указать здесь, что возвращаемое значение будет подчиняться протоколу Utility?)
 def get_utility do
   123
 end
end
источник

PG

Pïg Grëënëst in pro.elixir
источник

V

V in pro.elixir
@spec get_utility :: ??? (как указать здесь, что возвращаемое значение будет подчиняться протоколу Utility?)
источник

N|

Naiλ Gibaev | The Red King in pro.elixir
V
Котаны, можно ли в эликсире указать протокол в спеке? Например
defprotocol Utility do
 @spec type(t) :: String.t()
 def type(value)
end

defimpl Utility, for: BitString do
 def type(_value), do: "string"
end

defimpl Utility, for: Integer do
 def type(_value), do: "integer"
end

defmodule Some do
 @spec get_utility :: ??? (как указать здесь, что возвращаемое значение будет подчиняться протоколу Utility?)
 def get_utility do
   123
 end
end
вроде как нельзя, только через тип-сумму походу
источник

V

V in pro.elixir
Naiλ Gibaev | The Red King
вроде как нельзя, только через тип-сумму походу
это как?
источник

N|

Naiλ Gibaev | The Red King in pro.elixir
ну тут кст напиздел малец, у тебя все только стринг возвращается
источник

N|

Naiλ Gibaev | The Red King in pro.elixir
короче, наскок я знаю нельзя сослаться прям в протокол, только ручками указать @spec get_utility :: String.t
источник

V

V in pro.elixir
а если не стринг - что это меняет?
источник

LL

Lama Lover in pro.elixir
V
Котаны, можно ли в эликсире указать протокол в спеке? Например
defprotocol Utility do
 @spec type(t) :: String.t()
 def type(value)
end

defimpl Utility, for: BitString do
 def type(_value), do: "string"
end

defimpl Utility, for: Integer do
 def type(_value), do: "integer"
end

defmodule Some do
 @spec get_utility :: ??? (как указать здесь, что возвращаемое значение будет подчиняться протоколу Utility?)
 def get_utility do
   123
 end
end
Через opaque тип
источник

V

V in pro.elixir
пример можешь показать?
источник

N|

Naiλ Gibaev | The Red King in pro.elixir
V
а если не стринг - что это меняет?
если бы у тебя в разных реализациях протокола возвращался разный тип из полиморфной функции, то пришлось бы в спеке через пайп соединять возвращаемые типы:
@spec get_utility :: t1() | t2() | ...
источник

N|

Naiλ Gibaev | The Red King in pro.elixir
но очевидно что это так себе затея
источник

LL

Lama Lover in pro.elixir
V
пример можешь показать?
defmodule Utility do
 @opaque returned :: any()

 @spec type(t) :: returned()
 def type(value)
end

defmodule Some do
 @spec get_utility :: Utility.returned()
end
источник

V

V in pro.elixir
Naiλ Gibaev | The Red King
если бы у тебя в разных реализациях протокола возвращался разный тип из полиморфной функции, то пришлось бы в спеке через пайп соединять возвращаемые типы:
@spec get_utility :: t1() | t2() | ...
Ну нет, это некорректно. get_utility возвращает не String.t(), а структуру, к которой можно применить type, которая уже в свою очередь возвращает String.t.
Поэтому @spec get_utility :: String.t тоже некорректно
источник

N|

Naiλ Gibaev | The Red King in pro.elixir
а, я понял чего ты хочешь добиться
источник

V

V in pro.elixir
Lama Lover
defmodule Utility do
 @opaque returned :: any()

 @spec type(t) :: returned()
 def type(value)
end

defmodule Some do
 @spec get_utility :: Utility.returned()
end
если протокол кастомный, то может и сработать. спасибо.
UPD. а нет, не может :)
источник

LL

Lama Lover in pro.elixir
V
Ну нет, это некорректно. get_utility возвращает не String.t(), а структуру, к которой можно применить type, которая уже в свою очередь возвращает String.t.
Поэтому @spec get_utility :: String.t тоже некорректно
Аааа, я сначала неправильно понял
источник

V

V in pro.elixir
В общем, мне советуют так:
@spec get_utility :: Utility.t()
defprotocol автоматически объявляет тип t для модуля.
Диалайзер это вроде как не распознаёт, чисто для читаемости. Сейчас буду проверять.
источник