是否可以/应该在Scala中添加/创建从T到选项[T]的隐式转换?

是否可以/应该在Scala中添加/创建从T到选项[T]的隐式转换?,scala,scala-option,Scala,Scala Option,这是一个让事情更有效率的机会吗(对于程序员来说):我发现用Some,例如Some(5)来包装事情会让人有点厌烦。像这样的东西怎么样: implicit def T2OptionT( x : T) : Option[T] = if ( x == null ) None else Some(x) 当其他开发人员阅读您的代码时,这似乎会让他们感到困惑 一般来说,implicit似乎可以帮助从一个对象转换到另一个对象,避免混淆的转换代码,从而使代码变得混乱,但是,如果我有一些变量,它以某种方式变成了s

这是一个让事情更有效率的机会吗(对于程序员来说):我发现用
Some
,例如
Some(5)
来包装事情会让人有点厌烦。像这样的东西怎么样:

implicit def T2OptionT( x : T) : Option[T] = if ( x == null ) None else Some(x)

当其他开发人员阅读您的代码时,这似乎会让他们感到困惑

一般来说,
implicit
似乎可以帮助从一个对象转换到另一个对象,避免混淆的转换代码,从而使代码变得混乱,但是,如果我有一些变量,它以某种方式变成了
some
,那么这似乎会很麻烦


您可能想放一些代码来显示它的使用情况,看看它会有多混乱。

这对我来说很好,只是它可能不适用于原语T(不能为null)。我猜一个非专门化的泛型总是会得到装箱的原语,所以可能没关系。

您会失去一些类型安全性,并可能导致混淆。 例如:

  val iThinkThisIsAList = 2 
  for (i <- iThinkThisIsAList) yield { i + 1 }
val-itinkthisisalist=2

对于(i请注意,您可以使用该模式,以避免混淆,同时保持代码简洁

我所说的显式隐式的意思是,与其直接从
T
转换为
Option[T]
,不如直接转换为包装器对象,它提供了从
T
转换为
Option[T]
的方法

class Optionable[T <: AnyRef](value: T) {
  def toOption: Option[T] = if ( value == null ) None else Some(value)
}

implicit def anyRefToOptionable[T <: AnyRef](value: T) = new Optionable(value)
我相信这种方式是完全透明的,有助于理解编写的代码——以一种很好的方式消除对null的所有检查


注意
T隐式转换的一般准则如下:

  • 当您需要将成员添加到类型(一种“开放类”;又称“pimp my library”模式)时,请转换为扩展
    AnyRef
    并仅定义所需成员的新类型
  • 当您需要“更正”继承层次结构时。因此,您有一些类型
    A
    ,它应该具有子类
    B
    ,但由于某种原因没有。在这种情况下,您可以定义从
    A
    B
    的隐式转换
这些是唯一适合定义隐式转换的情况。任何其他转换都会很快遇到类型安全和正确性问题


t
扩展
选项[t]
真的没有任何意义,显然转换的目的不仅仅是添加成员。因此,这样的转换是不可取的。

您还可以尝试重载该方法:

def having(key:String) = having(key, None)

def having(key:String, default:String) = having(key, Some(default))

def having(key: String, default: Option[String]=Option.empty) : Create = {
  keys += ( (key, default) )
  this
}

我明白你的意思。然而,Option[T]的要点是它可以保存一个值或一个None,所以我觉得很直观,如果一个方法接受Option[T]类型的变量我应该能把一个T传递给它。你能想出一个你可能会有一些困惑的例子吗,例如,一个变量在无意中变成了一个a?嗨,弗拉维尤,这是一个有趣的建议。我总体上喜欢它——尽管我认为它会让我的问题变得更糟,而不是更好,而不是现在输入一些()我必须键入toOption…但它确实有使用null的优点。@flaviu cipcigan,也有相同但较短的隐式类IntWithTimes[T](x:T){def toOption:Option[T]=if(x!=null)Option(x)else None}至少在IntelliJ IDEA中,我可以看到什么东西自动转换(默认情况下,它带有下划线).但是也许应该有一种方法来指定隐式转换只应该在将值传递给方法时发生,而不是在对其调用方法时发生。
def having(key:String) = having(key, None)

def having(key:String, default:String) = having(key, Some(default))

def having(key: String, default: Option[String]=Option.empty) : Create = {
  keys += ( (key, default) )
  this
}