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

scala – 对此代码段返回类型与&without =相当混淆

发布时间:2020-12-16 18:24:56 所属栏目:安全 来源:网络整理
导读:object A extends App {def closure1(x:Int) = { object O { def getX = x def add(y:Int) = x+y } val foo = O foo}def closure2(x:Int) { object O { def getX = x def add(y:Int) = x+y } val foo = O foo}println(closure1(4).getClass)println(closure2
object A extends App {

def closure1(x:Int) = {
  object O {
   def getX = x
   def add(y:Int) = x+y
  }
  val foo = O
  foo
}

def closure2(x:Int) {
  object O {
   def getX = x
   def add(y:Int) = x+y
  }
  val foo = O
  foo
}

println(closure1(4).getClass)
println(closure2(4).getClass)
}

result:
 $scala A
 class A$O$3$
 void

>为什么返回类型不同?
>我真的不关心返回类型.我想调用getX并添加 – 我想做一些像closes1(4).getX这样的事情 – 这是非法的.我怎么做 ?

解决方法

Scala有一个代码的简写表示法,它不会返回任何有趣的值:省略=符号.在Java中,这将返回无效,即根本没有;但是在Scala中它实际上是(),这个类型中唯一一个叫Unit的成员.无论哪种方式,它都是相同的:没有任何东西或无意义的占位符.

你想要一个没有意义的占位符的原因是,当你编写通用代码时,你宁愿不必处理某些事情的情况,而不是以不同的方式处理.

无论如何:

def f(): Unit = println("Hi")

是一个显式只返回content-free()值的函数(也就是println返回的值).简写就是

def f() { println("Hi") }

现在有一个偷偷摸摸的补充,就是在Scala中,与许多C派生语言一样,你可以放弃你所做的任何返回值.当你扔掉它时,剩下的就是(). Scala会在关闭时警告你,你正在做一些可疑的事情:

<console>:16: warning: a pure expression does nothing in statement position
you may be omitting necessary parentheses
         foo
         ^
defined module A

但是仍然会让你这样做(因为历史上预计这将有效).

所以,总结一下:

def f {}

是一种只返回无内容占位符()的方法.如果你完整地写出来,语法就是

def f: Unit = {}

并且当您尝试返回错误类型的值时,而不是抱怨它会抛弃该值并为您键入Unit,但通常会发出警告:

def f: Unit = 5
def f { 5 }

(请注意,这些天的观点主要是针对短形式(这些日子是2.10稳定),很大程度上是因为在没有明确解释差异的情况下,新用户经常忽略=没有意识到它然后想知道为什么事情不起作用.所以在将来(弃用2.11或2.12?)def f {}形式可能不起作用.)

如果你真的想要一个返回值 – 因为,例如,你想要返回你的对象O(你可以直接做到这一点而不先将它分配给foo,顺便说一句),请确保包括=:

def f = { object O { def g = 5 }; O }

scala> f.g
res0: Int = 5

(提示:编译器会抱怨你在这里使用结构类型.你最好使用特征HasG {def g:Int}然后对象O扩展HasG;否则Scala实际上使用反射来调用fg的一些基本原理我从来没有完全遵循过.)

(编辑:李大同)

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

    推荐文章
      热点阅读