3

我正在玩 Ceylon,我正在尝试为元组创建别名。以下不起作用:

class MyPair(Integer i, Float f) => [i, f];
class MyPair(Integer i, Float f) => [Integer, Float](i, f);
class MyPair(Integer i, Float f) => 
        Tuple<Integer|Float, Integer, Tuple<Float, Float, Empty>>(i, [f]);
class MyPair(Integer i, Float f) => 
        Tuple<Integer|Float, Integer, Tuple<Integer|Float, Float, Empty>>(i, [f]);
class MyPair(Integer i, Float f) => 
        Tuple<Integer|Float,Integer,Tuple<Float,Float,Empty>>(i, Tuple<Float,Float,Empty>(f, []));

我在前两个上遇到的错误围绕着括号的使用:

Incorrect syntax: missing statement-ending ; at [ expecting statement-ending ;

第二个有两个单独的错误:

的一些变化

Alias parameter distance must be assignable to corresponding class parameter rest: Integer is not assignable to [Integer]

class MyPair

Argument must be a parameter reference to distance

f, [f], 或元组构造上。

有没有办法做到这一点?

4

3 回答 3

4

是的,=>类别名声明中的 RHS 上的实例化表达式目前受到极大限制,不是设计使然,而是因为在编译器后端实现对任意实例化表达式的完全支持需要一些额外的工作。

但我现在实际上要做的是使用常规类型alias,如下所示:

alias MyPair => [Integer,Float];

并像这样使用它:

MyPair pair = [1, 1.0];

我认为这实际上比使用class别名更干净。

HTH。

于 2015-08-13T01:24:04.460 回答
2

经过一番修补后,我遇到了

class MyPair(Integer i, [Float] f) => 
        Tuple<Integer|Float, Integer, Tuple<Float, Float, Empty>>(i, f);

哪个有效。

于 2015-08-12T07:35:36.490 回答
2

不能比您的解决方案做得更好,但您至少可以使用Resttype 参数的快捷方式:

class Pair([Integer i, [Float] f]) => Tuple<Integer|Float, Integer, [Float]>(i, f);

您在这里受到限制,因为您的类别名的参数类型必须与您正在使用别名的类的参数类型相匹配。如果我正确解释规范

注意:当前编译器施加了一个限制,即别名类的可调用类型必须可分配给类别名的可调用类型。将来会取消此限制。

那么这可能在后续版本中起作用:

class Pair(Integer i, Float f) => Tuple<Integer|Float, Integer, [Float]>(i, [f]);

甚至可能

class Pair(Integer i, Float f) => [i, f];

再说一次,如果你的目标是解构一个元组,Ceylon 1.2 会让你直接这样做:

value [i, f] = [2, 0.5];
于 2015-08-12T11:39:51.800 回答