[erlang-questions] Deriving records from one another?
Dmitry Kolesnikov
dmkolesnikov@REDACTED
Mon Jun 23 16:06:14 CEST 2014
Hello,
Yes, the composition (nested records) is one way to solve the issue.
I would not use two records #shared{} and #inner{}
> -record(state { shared :: #shared{}, inner :: #init{} | #etc{} }).
I would compose #shared{} record directly into state.
> -record(state { shared :: #shared{}, field1, field2, ...}).
you might want to isolate all #shared{} specific code to dedicated module so that all process will re-use same code base.
Best Regards,
Dmitry
On 23 Jun 2014, at 16:49, Roger Lipscombe <roger@REDACTED> wrote:
> I'm probably thinking too OO by calling it "deriving", but here's the problem:
>
> OTP handlers (gen_server, etc.) take a State parameter. You can stick
> anything in here, but generally I've been using a #state record, and
> keeping a bunch of values in it.
>
> Now I'd like to actually start representing *state* with the State[1].
> That is, I'd like to be able to match on #init, #ready,
> #expecting_key, #whatever records. This will hopefully make the code
> easier to read, and means that my record doesn't have to contain
> fields for stuff that's not relevant in the given state.
>
> However, some of the fields *are* shared between states, so my
> question is (in OO terms) how do I derive record types from
> each-other?
>
> I've thought about using a tuple: {Shared, State} when Shared ::
> #shared{}, State :: #init{} | #etc{}
> That might be hard to read in matches, though, maybe.
>
> I've thought about using a container record:
> -record(state { shared :: #shared{}, inner :: #init{} | #etc{} }).
>
> Are there any good solutions[2] to this problem? Or are there better
> ways to do what I'm trying to do?
>
> Cheers,
> Roger.
>
> [1] No, I don't think that gen_fsm is the answer at this point.
> Interesting suggestion, though, thanks.
> [2] Still on R16, so I can't use maps, but I'm still interested in how
> they might help, if at all.
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
More information about the erlang-questions
mailing list