2017-02-09 7 views
4

fooにはFStreamというクラスが含まれています。 fooというパッケージオブジェクトは、FStreamのエクステンダメソッドを提供するいくつかの暗黙の値クラスを定義します。私はこれらの値クラスをパッケージオブジェクトから個々のファイルに移動したいと思いますが、FStream(または、好ましくは、fooパッケージから何かを使用するときは、いつでも使用できるようにしたいと思います。これは暗黙の値クラスを他のオブジェクトに入れようとしましたが、オブジェクトからは拡張できませんでした。クラスや特性に入れようとしましたが、暗黙の値クラスは他のオブジェクトでのみ定義できます。Scala - 暗黙的な値クラスを別のスコープで利用できるようにする

foo/FStream.scala

package foo 

class FStream { 
    def makeFoo(): Unit = ??? 
} 

のfoo/package.scala

package foo 

package object foo { 

    // I want to move these definitions into separate files: 

    implicit class SuperFoo(val stream: FStream) extends AnyVal { 
    def makeSuperFoo(): Unit = ??? 
    } 

    implicit class HyperFoo(val stream: FStream) extends AnyVal { 
    def makeHyperFoo(): Unit = ??? 
    } 
} 

バー/ usage.scala

package bar 

import foo._ // something nice and short that doesn't reference individual value classes 

val x: FStream = ??? 
x.makeSuperFoo() // should work 
x.makeHyperFoo() // should work 

答えて

3

は、私はあなたが必須tutorial最初に読むことをお勧めします。

私の解決策はFStreamの付随オブジェクトです。したがって、FStreamをインポートしてすべての機能を利用できます。これはまた、特性を使用してファイルを区切ります。

のfoo/FStream.scala

package foo 

class FStream { 
    def makeFoo(): Unit = ??? 
} 

// companion provides implicit 
object FStream extends FStreamOp 

のfoo/FStreamOp.scala

package foo 

// value class may not be a member of another class 
class SuperFoo(val stream: FStream) extends AnyVal { 
    def makeSuperFoo(): Unit = ??? 
} 

class HyperFoo(val stream: FStream) extends AnyVal { 
    def makeHyperFoo(): Unit = ??? 
} 
trait FStreamOp { 
    // you need to provide separate implicit conversion 
    implicit def makeSuper(stream: FStream) = new SuperFoo(stream) 
    implicit def makeHyper(stream: FStream) = new HyperFoo(stream) 
} 

usage.scala

import foo.FStream 

object Main { 
    def main(args: Array[String]): Unit = { 
    val x: FStream = ??? 
    x.makeSuperFoo() // should work 
    x.makeHyperFoo() // should work 
    } 
} 
+0

これが正しい応答ですが、私はアドバイスとそうは思いません暗黙のうちに使用しないことについて。 インプリシットは、「ゼロコスト」(完全ではない)の構文エンリッチメントとTypeclassパターンを可能にする、非常に強力なスカラー機能です。 –

+0

私は正しい応答についてはわかりませんが、Herrington Darkholmeは間違いなく正しい名前です。私はまた、ヒューゴ・ファースと一緒に行くだろう。私は矛盾している。 –

+0

かなり、それは私の提案ではなく、scalaコンパイラのものです。コンパイル時に '-feature'引数を追加すると、コンパイラは暗黙的な使用について警告します。暗黙的な問題を解決するには、上記のチュートリアルを参照してください。 –