Size: a a a

Эликсир и Вунш

2019 March 20

ŹR

Źmićer Rubinštejn in Эликсир и Вунш
Źmićer Rubinštejn
Например, строка 13 реализации стека из статьи

{new_list, new_list}
Это прям по солиду
источник

к

кана in Эликсир и Вунш
Ilya Averyanov
Внутри самого генсервера типа нету динамического диспатча
хм, конкретно apply там нет

сделали send в процесс, процесс вызвал handle_call напрямую (как эрланг сам вызывает колбеки - хз)
источник

ŹR

Źmićer Rubinštejn in Эликсир и Вунш
Ведь очевидно же, что мы можем поменять genserver на что нибудь другое, и нам все еще надо будет возвращать тупл из двух одинаковых вещей
источник

ŹR

Źmićer Rubinštejn in Эликсир и Вунш
Я уже не говорю про то, когда появится cast
источник

ŹR

Źmićer Rubinštejn in Эликсир и Вунш
И пронять из apply где вызывать call а где cast не сможет никто и никогда
источник

DS

Dmitry Shpagin in Эликсир и Вунш
Źmićer Rubinštejn
И пронять из apply где вызывать call а где cast не сможет никто и никогда
apply уже внутри call/cast, тут не надо ничего понимать
источник

к

кана in Эликсир и Вунш
Dmitry Shpagin
apply уже внутри call/cast, тут не надо ничего понимать
нет в call/cast эплая, зачем там эплай-то
источник

ŹR

Źmićer Rubinštejn in Эликсир и Вунш
кана
нет в call/cast эплая, зачем там эплай-то
Он не о том
источник

к

кана in Эликсир и Вунш
ага, понял
источник

к

кана in Эликсир и Вунш
в колбеках call/cast
источник

ŹR

Źmićer Rubinštejn in Эликсир и Вунш
Он про реализацю
источник

DS

Dmitry Shpagin in Эликсир и Вунш
Źmićer Rubinštejn
Это прям по солиду
я уже хз, можно было бы и адаптер бахнуть, но тут и так примеров больше чем текста, а пример с apply привлек больше внимания, чем предложение выносить бизнес логику из генсервера
источник

ŹR

Źmićer Rubinštejn in Эликсир и Вунш
Dmitry Shpagin
apply уже внутри call/cast, тут не надо ничего понимать
Да, согласен, тут ты прав - просто будут одинаковые под копирку handle_cast и handle_call, а что именно вызывается написано в api
источник

ŹR

Źmićer Rubinštejn in Эликсир и Вунш
Адаптер был бы солидно, но тогда возможно не получится написать унифицированный apply
источник

DS

Dmitry Shpagin in Эликсир и Вунш
Źmićer Rubinštejn
Я уже не говорю про то, когда появится cast

def handle_cast({function_name, arguments}, state) do
 {_reply, new_state} = apply(StackImp, function_name, [state] ++ arguments)
   
 {:noreply, new_state}
end
источник

DS

Dmitry Shpagin in Эликсир и Вунш
было бы так, т.к. ответ не нужен
источник

DR

Dmitry Russ (Aleksandrov) in Эликсир и Вунш
Разница в том, что gen_server уже делает apply, а в реализации с форвардом делается ещё один apply. Для тестирования можно делать handle_call напрямую, а чтобы выносить логику в другой модуль и дергать через apply - для этого должна быть более везкая причина (возможность в разные имплементации GenServer-ов воткнуть имплементацию логики).
источник

ŹR

Źmićer Rubinštejn in Эликсир и Вунш
Я бы пользовался стандартным механизмом, по крайней мере нету иллюзий что коллбэки оторваны от генсервера, либо генерировал похожий apply через макрос или даже руками.

Кроме того, я бы не советовал так тестировать генсервер, потому что один сервер это один юнит, и должны быть веские причины чтобы эти функции так отдельно тестировать…
источник

к

кана in Эликсир и Вунш
(может быть опять не в тему, но я повторюсь, gen_server не делает apply)
источник

ŹR

Źmićer Rubinštejn in Эликсир и Вунш
Dmitry Russ (Aleksandrov)
Разница в том, что gen_server уже делает apply, а в реализации с форвардом делается ещё один apply. Для тестирования можно делать handle_call напрямую, а чтобы выносить логику в другой модуль и дергать через apply - для этого должна быть более везкая причина (возможность в разные имплементации GenServer-ов воткнуть имплементацию логики).
Где вы нашли apply в gs то? Может я чего не знаю
источник