gpt4 book ai didi

types - 具有类型和值限制以及默认值的 Erlang 记录

转载 作者:行者123 更新时间:2023-12-04 17:01:43 25 4
gpt4 key购买 nike

我正在尝试编写代表银行帐户的记录:

-record(account, {  name :: atom(),
type :: atom(),
balance = 0 :: integer() }).

我还想限制余额始终为 >= 0 .我该怎么做呢?

最佳答案

正如其他人所指出的,类型规范仅仅是分析工具的输入,如 PropEr。和 Dialyzer .如果您需要强制执行不变量 balance >= 0 ,帐户类型应该被封装,只有尊重不变量的函数才能访问:

-module(account).

-record(account, { name :: atom(),
type :: atom(),
balance = 0 :: non_neg_integer() }).

%% Declares a type whose structure should not be visible externally.
-opaque account() :: #account{}.
%% Exports the type, making it available to other modules as 'account:account()'.
-export_type([account/0]).

%% Account constructor. Used by other modules to create accounts.
-spec new(atom(), atom(), non_neg_integer()) -> account().
new(Name, Type, InitialBalance) ->
A = #account{name=Name, type=Type},
set_balance(A, InitialBalance).

%% Safe setter - checks the balance invariant
-spec set_balance(account(), non_neg_integer()) -> account().
set_balance(Account, Balance) when is_integer(Balance) andalso Balance >= 0 ->
Account#account{balance=Balance};
set_balance(_, _) -> error(badarg). % Bad balance

请注意,这类似于 Java 或 C++ 等面向对象语言中具有私有(private)字段的类。通过限制对“受信任的”构造函数和访问器的访问,可以强制执行不变量。

此解决方案不提供对 balance 的恶意修改的保护。 field 。另一个模块中的代码完全有可能忽略“不透明”类型规范并替换记录中的余额字段(从 records are just tuples 开始)。

关于types - 具有类型和值限制以及默认值的 Erlang 记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15840842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com