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

是否可以在Scala中实现不使用反射的`??`(来自C#的空合并运算符)

发布时间:2020-12-16 19:00:08 所属栏目:安全 来源:网络整理
导读:我在某处发现了C#null coalescing operator’??’的实现: implicit def coalescingOperator[T](pred: T) = new { def ??[A : T](alt: =A) = if (pred == null) alt else pred} 它可以像一个?? ?? b表示if(a == null)b else a. 在反编译类文件后,我看到它生
我在某处发现了C#null coalescing operator’??’的实现:

implicit def coalescingOperator[T](pred: T) = new {
  def ??[A >: T](alt: =>A) = if (pred == null) alt else pred
}

它可以像一个?? ?? b表示if(a == null)b else a.

在反编译类文件后,我看到它生成带反射的代码(在Scala 2.8.1中).

为什么它会生成反射,是否可以修改该代码,以免产生反射?

解决方法

Scala与Java没有相同的匿名类概念.如果你说的话

new {
  def fish = "Tuna"
}

那么它会将新方法的所有用法解释为需要结构类型,即与之相同

def[T <: {def fish: String}](t: T) = t.fish

因为没有共同的超类,所以需要使用反射.我不知道为什么会这样;这对性能来说完全是错误的,通常不是你需要的.

无论如何,修复很简单:创建一个实际的类,而不是匿名的类.

class NullCoalescer[T](pred: T) {
  def ??[A >: T](alt: => A) = if (pred == null) alt else pred
}
implicit def anyoneCanCoalesce[T](pred: T) = new NullCoalescer(pred)

在2.10中,它仍然可以做出可以说是错误的事情,但是(1)它会向你发出警告,以这种方式使用反射(所以至少你会知道它何时发生),除非你关闭它们,并且(2)你可以使用较短版本的隐式类/ * blah blah * /并跳过隐式def,它只是添加了样板文件.

(编辑:李大同)

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

    推荐文章
      热点阅读