是否可以在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,它只是添加了样板文件. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |