scala中的自动空断言

scala中的自动空断言,scala,macros,Scala,Macros,我想使用符号。我的意思是在这种情况下: class Person(val name:String) { assert(name != null) } 所有其他完整性检查都可以通过使用自定义参数类型来解决,但空检查总是需要反复编写。能给我点像这样的吗 class Person(val name:String!) // note the bang (!) 那个断言已经生成了吗?有简单的宏吗?您可以通过隐式类获得类似的东西 implicit class StringCheck(str :

我想使用
符号。我的意思是在这种情况下:

class Person(val name:String) {
  assert(name != null)  
} 
所有其他完整性检查都可以通过使用自定义参数类型来解决,但空检查总是需要反复编写。能给我点像这样的吗

class Person(val name:String!) // note the bang (!)

那个断言已经生成了吗?有简单的宏吗?

您可以通过隐式类获得类似的东西

implicit class StringCheck(str :String) {
  def ! :String = {assert(str != null); str}
}
这样,空测试语法就减少了

import scala.language.postfixOps
class Person(val name:String) {name!} 
…或者可能插入到其他代码中

class Person(val name:String) {
  if (name.!.length > 10) ...
  else ...  
} 

@simpadjo建议的更通用的版本

implicit class NotNullSupport[T](val obj :T) extends AnyVal {
  def ! : T = {assert(obj != null); obj}
}

您可以通过隐式类获得类似的内容

implicit class StringCheck(str :String) {
  def ! :String = {assert(str != null); str}
}
这样,空测试语法就减少了

import scala.language.postfixOps
class Person(val name:String) {name!} 
…或者可能插入到其他代码中

class Person(val name:String) {
  if (name.!.length > 10) ...
  else ...  
} 

@simpadjo建议的更通用的版本

implicit class NotNullSupport[T](val obj :T) extends AnyVal {
  def ! : T = {assert(obj != null); obj}
}

谢谢它能在任何类型的情况下工作吗?不仅仅是
String
?我认为您需要为每个特定类型提供一个隐式类。隐式转换对泛型类型不起作用。确实可以:隐式类NotNullSupport[t](val obj:t)扩展AnyVal{def!:t={assert(obj!=null);obj}}@jwvh为什么这样认为?看看,@simpadjo&@AlexeyRomanov;当然,你们都是对的。我最初的测试令人沮丧,但很快就完成了(当时我几乎没有时间)。而且IntelliJ IDE不喜欢值类,所以我得出了错误的结论。我的错,谢谢。它能在任何类型的情况下工作吗?不仅仅是
String
?我认为您需要为每个特定类型提供一个隐式类。隐式转换对泛型类型不起作用。确实可以:隐式类NotNullSupport[t](val obj:t)扩展AnyVal{def!:t={assert(obj!=null);obj}}@jwvh为什么这样认为?看看,@simpadjo&@AlexeyRomanov;当然,你们都是对的。我最初的测试令人沮丧,但很快就完成了(当时我几乎没有时间)。而且IntelliJ IDE不喜欢值类,所以我得出了错误的结论。我的错。