在Erlang中使用Dialyzer的行为模拟接口



我想要一个在Erlang中等效的Java接口。我如何为透析器提供一个-spec合同,使我能够尽可能接近Java提供的功能?

假设我想要一个等价的东西:

//Filename: Sports.java
public interface Sports
{
   public void setHomeTeam(String name);
   public void setVisitingTeam(String name);
}
//Filename: Football.java
public interface Football extends Sports
{
   public void homeTeamScored(int points);
   public void visitingTeamScored(int points);
   public void endOfQuarter(int quarter);
}
//Filename: Hockey.java
public interface Hockey extends Sports
{
   public void homeGoalScored();
   public void visitingGoalScored();
   public void endOfPeriod(int period);
   public void overtimePeriod(int ot);
}

您可以使用-callback属性实现此功能:

%% Filename: sport.erl
-module(sport).
-callback setHomeTeam(Name :: string()) -> ok.
-callback setVisitingTeam(Name :: string()) -> ok.

当你想提供这个接口时:

-behavior(sport).

然而,我目前不能想到一种方法来做行为之间的继承。您可以使用包含相关-behaviour属性的.hrl文件来模拟它,而不是逐字指定它们,但这感觉很脏。

Dialyzer将检查回调是否满足指定的-specs,如果行为模块与使用它们的模块一起分析或已经在PLT中。

相关内容

  • 没有找到相关文章

最新更新