首页
学习
活动
专区
圈层
工具
发布

ADTs和值
EN

Stack Overflow用户
提问于 2015-07-25 15:42:15
回答 1查看 42关注 0票数 0

在Rascal中,说我有密码:

代码语言:javascript
复制
value x = 2;
data Exp = con(int n);

是否有一种方法来调用con(x),而x是一个值(但实际上是一个整数),而不事先知道con的第一个参数应该是什么类型(因此没有显式地将其转换为int)?

为什么可以调用一个函数,比如something( into )= n,将一个整数定义为一个值(例如,值y= 2)传递给它的第一个参数,而当我试图对用户定义的ADT执行同样的操作时,它却给了我一个错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-25 16:12:42

当您在Rascal中调用一个函数时,它实际上是对参数执行模式匹配。因此,如果您定义了int something(int n) = n;,然后调用something(x),它将xint n匹配,看到x实际上是一个int (因此它可以将值绑定到n),并调用该函数。

如果要定义value x = 2.5,然后调用something(x),则会得到一个错误,因为它不能将值2.5绑定到int n。您可以使用第二个定义重载something,这个定义使用的是一个真实的定义,比如int something(real r) = toInt(r);,然后它就可以工作了。但是,这里有两项需要注意:在这两种情况下,something都需要返回相同的类型,您需要导入util::Math才能访问toInt

当您使用构造函数(如con(x) )时,它不会自动为您进行模式匹配。您给它的类型必须与它期望的类型匹配。如果您知道x将始终是一个int,那么最好将其声明为int。另一种选择是创建一个像Exp makeCon(int n) = con(n);这样的函数,然后您可以随意使用它,即Exp myExp = makeCon(x);。在这种情况下,最好包含函数的默认版本,以防您给它一些意外的东西,比如default Exp makeCon(value x) { throw "Unexpected value <x>"; },这样如果您尝试用不是int的东西创建一个con,您就会得到一个可以处理的错误,可以创建自己的错误消息,添加额外的错误处理而只显示一条消息,查看导致问题的值等等,而不是让解释器给出一个错误(这可能不会给出您想要的所有信息)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31628214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档