<div dir="ltr"><div dir="ltr">Yes, `state` can be any data structure of erlang, and `record` is another form of `tuple`. `-record(state....` equals to `{state, ....}`</div><div>I prefer record to tuple in some cases because the element can be matched/retrieved without considering the order. the example:</div><div><br></div><div>`#state{refs = Refs} = State`, </div><div><br></div><div>do the same thing using tuple, you should take care of the order and must fully matched</div><div><br></div><div>{_, _, Ref, _, _} = State</div><div dir="ltr"><br></div><div>-Jack</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Jun 2, 2019 at 6:25 PM I Gusti Ngurah Oka Prinarjaya <<a href="mailto:okaprinarjaya@gmail.com">okaprinarjaya@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hi,<div><br></div><div>I still learn Erlang OTP from <a href="http://learnyousomeerlang.com" target="_blank">learnyousomeerlang.com</a> especially part <a href="https://learnyousomeerlang.com/building-applications-with-otp" target="_blank">https://learnyousomeerlang.com/building-applications-with-otp</a> .</div><div><br></div><div>Let's see code below:<br><br></div><div><font face="courier new, monospace">-module(ppool_serv).<br>-behaviour(gen_server).<br>....</font></div><div><font face="courier new, monospace">....</font></div><div><font face="courier new, monospace">-record(state, {limit=0, sup, refs, queue=queue:new()}).<br>....</font></div><div><font face="courier new, monospace">....</font></div><div><font face="courier new, monospace">init({Limit, MFA, Sup}) -><br>  self() ! {start_worker_supervisor, Sup, MFA},<br><br>  %% why using -record here for state holder?<br>  {ok, #state{limit=Limit, refs=gb_sets:empty()}}.</font><br></div><div><br></div><div>From the code above, why using record to hold state?<br><br></div><div>Other than using record we also can use tuple right? Let's see alternative code below</div><div><br></div><div><font face="courier new, monospace">-module(ppool_serv).<br>-behaviour(gen_server).<br>....<br>....<br>....<br>init({Limit, MFA, Sup}) -><br>  self() ! {start_worker_supervisor, Sup, MFA},<br><br>  Refs = gb_sets:empty(),<br>  Queue = queue:new(),<br>  Spv = undefined,<br>  State = {Limit, Spv, Refs, Queue},<br><br>  {ok, State}.<br>...<br>...<br>...<br>handle_call({run, Args}, _From, {Limit, Spv, Refs, Queue}) when N > 0 -><br>  {ok, Pid} = supervisor:start_child(Spv, Args),<br>  Ref = erlang:monitor(process, Pid),<br>  NewRefs = gb_sets:add(Ref, Refs),<br>  NewState = {Limit-1, Spv, NewRefs, Queue},<br>  {reply, {ok, Pid}, NewState};</font><br></div><div><br></div><div>We also can use the above alternative code right?<br><br>Please enlightenment </div><div><br></div><div><br></div><div>Thank you </div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></div>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature">Jack Tang<br><br><br><a href="http://www.linkedin.com/in/jacktang" target="_blank">http://www.linkedin.com/in/jacktang</a><br></div></div>