[erlang-questions] Exporting a record type

Fri Jul 10 18:11:18 CEST 2015

Hi Gordon,

The why is beginning to penetrate. The how is still murky. Examples definitely help.

If I understand your riak example, it looks to me like the module riak_object.erl, among other things, defines a record called #r_object{...}, then employs the -opaque  declaration to hide the structure of #r_object{}  behind a veil, giving it an alias, riak_object() (line 67).

But as I scan further down the module, I see riak_object() used in many -spec declarations but not in a single function definition; while #r_object{...} shows up in numerous functions (Lines 135, 144, 151, etc.).

Is my understanding correct that one would strive to define all functions accessing #r_object{...) directly in and only in the module riak_object and it is these functions that would be exported?

I see that the alias riak_object() is exported. How would it, then, be called in other modules to populate or access #r_object{}?

Here's my case:

In the module wg_dets_books.erl I've defined:

-record(book, {

-opaque book() :: #book{}.


In another module I query a remote db that returns:

   Title        = get_title(Xml),
   Author       = get_author(Xml),
   Publisher    = get_publisher(Xml),
   PubDate     = get_pub_date(Xml),
   SmallImage  = get_small_image(Xml),
   LargeImage  = get_large_image(Xml),
   CoverCopy  = get_cover_copy(Xml),

So, now what syntax would I use in this module to populate the book record?

Apologies to all for my dense mentality, but this seems like a fundamental and important matter of Erlang craft that I want to understand thoroughly.

All the best,



-----Original Message-----
From: "Gordon Guthrie" <gguthrie@REDACTED>
Sent: Friday, July 10, 2015 11:18am
To: "Lloyd R. Prentice" <lloyd@REDACTED>
Cc: "Jesper Louis Andersen" <jesper.louis.andersen@REDACTED>, "erlang-questions" <erlang-questions@REDACTED>
Subject: Re: [erlang-questions] Exporting a record type

Maybe an example would help.

This is the riak_object from Basho’s riak and it is an encapsulated record with exported types and transactional functions that operate on the opaque object:
https://github.com/basho/riak_kv/blob/develop/src/riak_object.erl <https://github.com/basho/riak_kv/blob/develop/src/riak_object.erl>

It is written like this because it is passed around the whole system and persisted to the metal, so opacity and forward/backward changes need to be able to be dropped into the code base with rewriting *everything*


> Le 10 juil. 2015 à 16:05, Lloyd R. Prentice <lloyd@REDACTED> a écrit :
> Thanks Jesper and to all who have so generously responded.
> Jesper, can you please expand on the following:
> "Generally you want to avoid module 'foo' to contain getter/setter pairs and define the "transactional" states that can happen to 't'."
> Where would one define getter/setter pairs? What do you mean by "transactional" states?
> Many thanks,
> Lloyd
> Sent from my iPad
>> On Jul 10, 2015, at 7:25 AM, Jesper Louis Andersen <jesper.louis.andersen@REDACTED> wrote:
>> Generally you want to avoid module 'foo' to contain getter/setter pairs and define the "transactional" states that can happen to 't'.
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions

More information about the erlang-questions mailing list