【问题标题】:scala: alias for a keyword?scala:关键字的别名?
【发布时间】:2011-08-19 00:10:59
【问题描述】:

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

编辑:

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

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

如果它看起来像这样会更好:

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

只是为了不让 val 堆叠在 def 之上,这两个名称非常相似。 (function_名字不是用来调用的,所以让名字相似是最干净的。)

【问题讨论】:

标签: scala


【解决方案1】:

如果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) = { ... }

【讨论】:

  • 你是对的,在“函数”中移动装饰消除了这种需要。缺点是人们必须使用两种不同的语法来编写函数——一种使用 val,另一种使用更简洁的“def fn(arg: ...)”。这可能会严重影响可读性。
  • 我可以理解您的观点,但这确实是语言本身的固有问题。你只能用val 声明函数(或其他值),你只能用def 声明方法。因此,程序员必须理解这两种语法才能理解该语言。
【解决方案2】:

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

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

听起来还是有点麻烦。

【讨论】:

    【解决方案3】:

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

    首先,您将方法命名为“function_”,它们不是一回事,方法只是某个类的成员,函数本身就是对象(尽管方法可以由编译器“提升”为函数,类似于原语的自动装箱)。

    第二,Decorate是什么?开头的大写字母表明它是一个单例,因此是一个对象,并且是该表达式中唯一实际的“函数”!

    您能否发布更多关于方法和装饰器实际作用的信息,以便我可以为您提供一个更好的示例,说明如何在 Scala 中实现同样的功能?

    【讨论】:

    • 从发帖者的上一行问题猜测,Decorate 类似于this answer 底部的Memoize 对象
    • 即使Decorate 也不是真正的函数:它的apply 方法具有类型参数和隐式参数。但是,我怀疑该方法的名称对发帖人的问题并不重要。它也可能是 foo_ 和关联的 foo 函数。
    • @aaron - 是的,虽然我觉得一个没能体会到区别的感觉,而且缺乏对函数的compose等方法的了解,加上需要在方法后加_后缀强制部分应用的名称都是造成 OP 问题的因素。
    【解决方案4】:

    不,没有。

    (填充所以让我发帖)

    【讨论】:

      猜你喜欢
      • 2021-10-25
      • 2010-11-15
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      • 1970-01-01
      相关资源
      最近更新 更多