Инициализация записи со значениями по умолчанию - PullRequest
2 голосов
/ 01 августа 2011

Какова обычная практика инициализации записи значениями по умолчанию, если они не указаны явно?

Чтобы проиллюстрировать мой вопрос, возьмите этот код Python:

class Encoder:
    def __init__ (self, minLength = 1, maxLength = 258, maxDistance = 32768):
        self.__minLength = minLength
        self.__maxLength = maxLength
        self.__maxDistance = maxDistance
        self.__window = []
        self.__buffer = []

Теперь я пытаюсь сделать то же самое в эрланге, то есть создать запись с перезаписываемыми значениями по умолчанию. Мое решение пока следующее:

-record (encoder, {minLength, maxLength, maxDistance, window = [], buffer = [] } ).

init (Options) ->
    case lists:keyfind (minLength, 1, Options) of
        false -> MinLength = 3;
        {minLength, MinLength} -> pass
    end,
    case lists:keyfind (maxLength, 1, Options) of
        false -> MaxLength = 258;
        {maxLength, MaxLength} -> pass
    end,
    case lists:keyfind (maxDistance, 1, Options) of
        false -> MaxDistance = 32768;
        {maxDistance, MaxDistance} -> pass
    end,
    #encoder {minLength = MinLength,
        maxLength = MaxLength,
        maxDistance = MaxDistance}.

Это, ну, неуклюжий.

Мои вопросы:

  • Есть ли какая-то языковая конструкция или синтаксический сахар, который спасает меня весь этот код?
  • Какая обычная практика для достижения этой цели?
  • Какую обычную практику использовать вместо моего атома pass, который я явно украл у питона?

1 Ответ

5 голосов
/ 01 августа 2011

Вы можете использовать модуль proplists следующим образом:

-record (encoder, {minLength, maxLength, maxDistance, window = [], buffer = [] } ).

init (Options) ->
    #encoder {minLength = proplists:get_value(minLength, Options, 1),
        maxLength = proplists:get_value(maxLength, Options, 256),
        maxDistance = proplists:get_value(maxDistance, Options, 32768)}.

...