加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

了解Scala块

发布时间:2020-12-16 09:37:06 所属栏目:安全 来源:网络整理
导读:我很难找到具体的答案,我知道的是一些微不足道的事情。我想了解块在Scala中的工作原理。我来自一个java / ruby??背景,似乎scala有一个完全不同的方式使用块。 以下代码来自Play! Framework website.我想了解Action在语义上如何。它是一个接受块的对象或函
我很难找到具体的答案,我知道的是一些微不足道的事情。我想了解块在Scala中的工作原理。我来自一个java / ruby??背景,似乎scala有一个完全不同的方式使用块。

以下代码来自Play! Framework website.我想了解Action在语义上如何。它是一个接受块的对象或函数,也可能不是。

object Application extends Controller {

  def index = Action {
    Ok(views.html.index("Your new application is ready."))
  }

}

如果它是一个功能,或许这是下面的语法糖(在这种情况下scala如何传递给幕后的块):

def index = Action({
    Ok(views.html.index("Your new application is ready."))
  })

或者是我不知道的一些scala语法。

任何对Scala源代码的引用将帮助我了解这是如何在幕后工作的。

解决方法

你最好将scala块作为java匿名类(如Guava功能)而不是ruby块。实际上,如果反编译scala代码,你会看到或多或少的代码( taken from Guava examples):

Function<String,Integer> lengthFunction = new Function<String,Integer>() {
  public Integer apply(String string) {
    return string.length();
  }
};

不同的是,scala提供了很多语法糖,并允许您将以上代码写为:

val lengthFunction = { string: String => string.length }

至于一个具体的动作例子:

def index = Action({
    Ok(views.html.index("Your new application is ready."))
  })

这里Action可能是具有apply方法的对象。另一个scala糖:语言允许你写Foo(bar),意思是Foo.apply(bar)。接下来,you can drop round braces when your call isn’t ambiguous,所以是的,它实际上是一个被称为如下的方法:

def index = Action({
    Ok(views.html.index("Your new application is ready."))
})

并有像这样的签名:

object Action {
  def apply(block: => Result) = ???
}

如@yan所说,这是scala的方式说嘿,我是一个功能,接受另一个产生结果的功能

desugared调用将看起来像

def index = Action.apply(new AbstractFunction[Result] {
        def apply() = Ok.apply(views.html.index.apply("..."))
})

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读