特性のコンテキストからケースクラスのパラメータにアクセスする方法

Aug 21 2020

私には特徴があります、言う:

sealed trait foo

そして、特性を拡張するケースクラス:

case class bar(data: List[String]) extends foo

バーのデータにアクセスする関数を書きたいのですが、それはfooとして渡されます。

def doSomething(x: foo) = {does something with foo.data}

そしてこのように呼ばれます:

val aBar = bar(some list)
doSomething(aBar)

しかし、関数doSomethingがタイプfooを予期している場合はアクセスできません。これを回避してバータイプの値にアクセスするにはどうすればよいですか?

回答

2 SethTisue Aug 21 2020 at 08:53

これがあなたのプログラムの文脈で意味があるかどうかはわかりませんがFoo、次のように定義できます。

trait Foo {
  def data: List[String]
}

それが意味をなさない場合は、おそらくパターンマッチングを行う必要があります。

def doSomething(x: Foo) =
  x match {
    case bar: Bar => ...    // or `case Bar(data)`, as Luis suggests

私は大文字であることに注意してくださいFooBarどこにでも。クラス名とトレイト名は、少なくとも他の誰か(たとえば、Stack Overflowであなたを助けている人)が混乱することなくコードを読めるようにしたい場合は、常にScalaコードで大文字にする必要があります。