scala:关键字的别名?
有没有办法为scala关键字创建别名?特别是,我有一些涉及“val”的样板语法,为了便于阅读,我希望能够键入一些“@@”,并将其翻译为val 编辑: 在某些情况下,可以很方便地替换“lazy val”,而不仅仅是“val”。用例与充当python装饰器的函数有关。看起来是这样的:scala:关键字的别名?,scala,Scala,有没有办法为scala关键字创建别名?特别是,我有一些涉及“val”的样板语法,为了便于阅读,我希望能够键入一些“@@”,并将其翻译为val 编辑: 在某些情况下,可以很方便地替换“lazy val”,而不仅仅是“val”。用例与充当python装饰器的函数有关。看起来是这样的: lazy val function = Decorate(function_ _) def function_(x: Int, ...) = { ... } @ function = Decorate(functio
lazy val function = Decorate(function_ _)
def function_(x: Int, ...) = { ... }
@ function = Decorate(function_ _)
def function_(x: Int, ...) = { ... }
如果它看起来像这样会更好:
lazy val function = Decorate(function_ _)
def function_(x: Int, ...) = { ... }
@ function = Decorate(function_ _)
def function_(x: Int, ...) = { ... }
这样就不会在def上叠加val,因为两个名称非常相似。(函数名不是用来调用的,因此它是最干净的,可以使名称相似。)不,没有
(请允许我发布)不,没有
(请允许我发布)哎哟!这不是特别惯用的Scala 首先,您将一个方法命名为“
function”\uuuquo;
”,它们不是一回事,一个方法只是某个类的一个成员,一个函数本身就是一个对象(尽管编译器可以通过类似于原语自动装箱的方式将一个方法“提升”到一个函数)
第二,什么是装饰?首字母大写表示它是一个单例,因此是一个对象,也是该表达式中唯一实际的“函数”
你能发布更多关于方法和装饰器实际工作的信息吗?这样我就可以给你一个更好的例子,告诉你如何在Scala中实现同样的功能!这不是特别惯用的Scala 首先,您将一个方法命名为“
function”\uuuquo;
”,它们不是一回事,一个方法只是某个类的一个成员,一个函数本身就是一个对象(尽管编译器可以通过类似于原语自动装箱的方式将一个方法“提升”到一个函数)
第二,什么是装饰?首字母大写表示它是一个单例,因此是一个对象,也是该表达式中唯一实际的“函数”
你能不能就方法和装饰器的实际功能发布更多的信息,以便我能给你一个更好的例子,说明如何在Scala中实现同样的功能?我想可以编写一个Scala编译器插件来实现这一点。至少Eclipse插件实际上使用了原始的Scala编译器,因此它可能会与IDE配合得很好 其他:丹尼尔·C·索布拉尔是对的:不,没有
尽管如此,这听起来还是有点麻烦。我想可以编写一个Scala编译器插件来实现这一点。至少Eclipse插件实际上使用了原始的Scala编译器,因此它可能会与IDE配合得很好 其他:丹尼尔·C·索布拉尔是对的:不,没有
尽管如此,这听起来还是有点麻烦。如果
函数从来都不是直接调用的,为什么不编写呢
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) = { ... }
如果函数
从来都不是直接调用的,为什么不写呢
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
关键字。如果它是故意存在的,请注意,代码不会被编译。了解用例的更多细节将非常有用。@@@只短一个字符,显然不容易阅读。“这听起来像是一个文本预处理器可以处理的东西,如果你真的需要它的话。”保罗同意了,并进行了编辑。谢谢相关问题:我在你的帖子中删掉了一个多余的val
关键字。如果是有意的,请注意代码不会编译。从海报的前一行问题猜测,decoration
类似于decoration
底部的Memoize
对象,甚至decoration
也不是真正的函数:它的apply
方法具有类型参数和隐式参数。然而,我怀疑这个方法的名称对于发帖人的问题并不是很关键。它也可能是带有关联的foo
函数的foo
。@aaron-是的,尽管我觉得没有意识到这一区别,并且缺乏对函数的compose
等方法的了解,再加上需要在方法名称后加上后缀\uu
,以强制部分应用,这些都是OP问题的原因。从海报的前一行问题猜测,decoration
类似于decoration
底部的Memoize
对象,它实际上不是一个函数:它的apply
方法具有类型参数和隐式参数。不过,我怀疑