2015-03-25 78 views
0

我想知道如果这个代码的小片段:在字符串中使用Option [string]是Scala中最干净的方法吗?

val some = Some("string").getOrElse("") 
val none = None.getOrElse("") 

println(s"some $some none $none") -> some string none 

可以写成清洁?我主要看着getOrElse部分。

我可以在字符串中使用选项而无需使用getOrElse吗?

感谢您的输入:)

戴维

+2

你想达到什么目的?这个代码可以用'val some =“string”更清晰; val none =“”;':-) – 2015-03-25 09:23:02

+0

这只是我遇到工作的一个例子,它不是一个真实的生活逻辑例子哈哈! :) – Davey 2015-03-25 09:24:17

+2

任何人都可以回答你的问题,如果他看不到代码,代码可以改进,所以不明白你需要改进什么,使得更清洁? – 2015-03-25 09:27:38

回答

3

可以定义一个 “扩展方法”:

implicit class StringOptionOps(val x: Option[String]) extends AnyVal { 
    def getOrEmpty = x.getOrElse("") 
    // any other methods you want to add to Option[String] 
} 

和/或customize string interpolation作为要处理Option S(未测试) :

implicit class StringOptionInterp(val sc: StringContext) { 
    def my(args: Any*) = { 
    val args1 = args.map { 
     case None => "" 
     case Some(x) => x 
     case x => x 
    } 
    sc.s(args1: _*) 
    } 
} 

// println(my"some ${Some("string")} none $None") -> some string none 
+0

谢谢,字符串插值定制对我来说是新的! – Davey 2015-03-25 09:51:18

+0

@JonathanCrosmer不,这将是从'Option [String]'到'String'的隐式转换(我非常不推荐)。 – 2015-03-25 12:58:40

+0

你说得对,我误解了代码;抱歉! (删除不正确的评论) – 2015-03-25 14:35:40

3

这是阿列克谢' s解决方案 - 应用pimp-my-library模式。

通过轻微滥用CanBuildFrom含义,可以编写适用于包装集合类型的选项的通用扩展方法orEmpty

基本上需要的是一种抓住某个包装类型的空实例的方法。这也可以在scalaz中使用Monoid.empty来完成。 CanBuildFrom解决方案的优点是不依赖于外部依赖性。

implicit class RichOpt[A](opt: Option[A]) { 
    import collection.generic.CanBuildFrom 

    def orEmpty[To >: A](implicit cbf: CanBuildFrom[A,_,To]): To = 
     opt.getOrElse(cbf().result()) 
} 

//--------- Examples -------------- 

println("some seq: " + (None: Option[Seq[Int]]).orEmpty) 
//>some seq: List() 

println("none seq: " + (Some(Seq(1,2,3))).orEmpty) 
//>none seq: List(1, 2, 3) 


println("some range: " + (Some(1 to 3)).orEmpty) 
//>some range: Range(1, 2, 3) 

println("none range: " + (None: Option[Range]).orEmpty) 
//>none range: Vector() 


println("some string: " + Some("abc").orEmpty) 
//>some string: abc 

println("none string: " + (None: Option[String]).orEmpty) 
//>none string: 
+0

甜,我一直在发现自己在做这种事情,从来不知道它实际上是一个'模式':-) – Davey 2015-03-25 14:58:25

相关问题