[erlang-questions] Exporting a record type

Lloyd R. Prentice lloyd@REDACTED
Fri Jul 10 03:51:25 CEST 2015


Thanks Bob and Fernando,

Fernando, your code example is a great help. 

Thanks again,

Lloyd

Sent from my iPad

> On Jul 9, 2015, at 8:56 PM, Fernando Benavides <elbrujohalcon@REDACTED> wrote:
> 
> Loïc will correct me if I'm wrong but the idea is to use records *only* as an internal representation of your data types.
> For instance, let's say in your system you have shoes (for lack of a better thing). You'll then create a module called shoes.erl:
> 
> -module(shoes).
> 
> -export([new/2, id/1, color/1, color/2, size/1, size/2]).
> 
> -record(shoe, {id = new_id(), color, size}).
> -opaque shoe() :: #shoe{}.
> -export_type([shoe/0]).
> 
> new(Color, Size) -> #shoe{color = Color, size = Size}.
> id(#shoe{id = Id}) -> Id.
> color(#shoe{color = Color}) -> Color.
> color(Shoe, Color) -> Shoe#shoe{color = Color}.
> size(#shoe{size = Size}) -> Size.
> size(Shoe, Size) -> Shoe#shoe{size = Size}.
> 
> new_id() -> implement:it(yourself).
> 
> Whenever you need to work with shoes anywhere in your system, you just use the functions exported by the module. Let's say you have a list of shoes and you only want those of a particular size:
> 
> filter_by_size(Shoes, Size) ->
>   [Shoe || Shoe <- Shoes, shoes:size(Shoe) == Size].
> 
> Hope this helps.
> 
> 
> 
> Fernando Benavides
> 
>> On Thu, Jul 9, 2015 at 5:17 PM, Bob Ippolito <bob@REDACTED> wrote:
>>> On Thu, Jul 9, 2015 at 5:05 PM, <lloyd@REDACTED> wrote:
>>> 
>>> In  Loïc's new book, The Erlanger Playbook, he advocates against using including records through *.hrl. (pp 40-41)
>>> 
>>> Instead, he recommends using types:
>>> 
>>> -record(state, {}).
>>> -opaque state() :: #state{}.
>> 
>> This looks like the fairly common recommendation of: don't export records. Treat them as an opaque data type, and provide functions for working with them.
>>  
>>> He leaves hanging the question of how to access this record from another module.
>>> 
>>> The Erlang Types and Function Specifications doc suggests that the type can be exported using -export_type(...). But, to my feeble mind, the exposition is less than clear.
>>> 
>>> My case and problem is as follows:
>>> 
>>> -record(book, {
>>>    ... yada yada (some seven fields)
>>>    }
>>> 
>>> I define the record, then:
>>> 
>>> -opaque book() :: #book{}.
>>> 
>>> -export_type([book/0]).
>>> 
>>> Now, I access a remote db in a different module and want to instantiate a book record, but it's not at all clear to me how to do so.
>> 
>> You don't. You have a function in the module that defines book that can create a book record, and other functions to manipulate them.
>> 
>> An example of this style would be the dict module. It uses records internally to implement a dictionary data structure, but you don't have direct access to the record(s) that it uses. Just functions to work with them.
>> 
>> -bob
>> 
>> 
>> _______________________________________________
>> erlang-questions mailing list
>> erlang-questions@REDACTED
>> http://erlang.org/mailman/listinfo/erlang-questions
> 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20150709/8a240b5f/attachment.htm>


More information about the erlang-questions mailing list