scala:关键字的别名?

时间:2011-05-05 01:48:28

标签: scala

有没有办法为scala关键字创建别名?特别是我有一些涉及“val”的样板语法,为了便于阅读,我希望能够输入“@@”,并将其转换为val。

编辑:

在某些情况下,能够替换“lazy val”可能非常方便,而不仅仅是“val”。用例与充当python装饰器的函数有关。它看起来像这样:

lazy val function = Decorate(function_ _)
def function_(x: Int, ...) = { ... }
如果它看起来像这样会好很多:

@ function = Decorate(function_ _)
def function_(x: Int, ...) = { ... }

只是为了在def的顶部没有堆叠的val,两个名字都非常相似。 (函数名称不是要调用的,因此最简洁的方法是使名称相似。)

4 个答案:

答案 0 :(得分:8)

不,没有。

(填充因此SO会让我发布)

答案 1 :(得分:1)

哎哟!这不是特别惯用的Scala。

首先,你要命名一个方法“function_”,它们不是同一个东西,一个方法只是某个类的成员,一个函数本身就是一个对象(尽管一个方法可以被编译器“提升”到一个函数,其方式类似于原语的自动装箱。)

其次,Decorate是什么?最初的大写字母表明它是一个单例,因此是一个对象,也是该表达式中唯一的实际“函数”!

你可以发布一些关于方法和装饰器实际做了什么的信息,这样我可以给你一个更好的例子来说明你如何在Scala中实现同样的目标吗?

答案 2 :(得分:0)

我想可以编写一个Scala编译器插件来实现这一目标。至少Eclipse插件实际上使用了原始的Scala编译器,因此可能实际上可以很好地与IDE配合使用。

除此之外:Daniel C. Sobral是正确的:不,没有。

听起来有点麻烦但是收获有点小。

答案 3 :(得分:0)

如果永远不打算直接调用function_,为什么不写

lazy val function = Decorate { (x: Int, ...) => ... }

甚至

/**
 * This version makes it more explicit that it's a function value.
 */
lazy val function: (Int, ...) => ReturnType =
   Decorate { (x, ...) => ... }

建议谨慎:简洁和简洁是两回事。在这里,看起来你试图在可读性方面以非常高的价格购买一些击键。

<强>更新

如果你真的想为这种事情实现更简单的语法,你将需要一个编译器插件。如果您要走得那么远,我建议使用基于注释的语法,这对Java / Scala开发人员来说可能非常直观:

@decorate(Memoize)
def slowFn(i: Int) = { ... }