[解決済み] 型の論理和(ユニオン型)はどのように定義するのですか?
質問
を持つ一つの方法です。 提案された オーバーロードされたメソッドの二重定義に対処するために、オーバーロードをパターンマッチに置き換えることです。
object Bar {
def foo(xs: Any*) = xs foreach {
case _:String => println("str")
case _:Int => println("int")
case _ => throw new UglyRuntimeException()
}
}
このアプローチでは、以下の引数の静的型チェックを放棄する必要があります。
foo
. と書くことができれば、もっと素敵です。
object Bar {
def foo(xs: (String or Int)*) = xs foreach {
case _: String => println("str")
case _: Int => println("int")
}
}
で近づくことができる。
Either
しかし、2つ以上の型を使用すると、すぐに醜くなってしまいます。
type or[L,R] = Either[L,R]
implicit def l2Or[L,R](l: L): L or R = Left(l)
implicit def r2Or[L,R](r: R): L or R = Right(r)
object Bar {
def foo(xs: (String or Int)*) = xs foreach {
case Left(l) => println("str")
case Right(r) => println("int")
}
}
一般的な(エレガントで効率的な)解決策としては、以下のように定義する必要がありそうです。
Either3
,
Either4
, .... 同じ目的を達成するための別の解決策をご存知の方はいらっしゃいますか?私の知る限り、Scalaには組み込みの"型分離関数"がありません。また、上で定義した暗黙の変換は、標準ライブラリのどこかに潜んでいて、それをインポートすればいいのでしょうか?
どのように解決するのですか?
さて、具体的な事例としては
Any*
というのも、混合型を受け付けないからです。しかし、混合型はオーバーロードでも動作しないので、これはあなたが望むことかもしれません。
まず、以下のように受け入れたい型を持つクラスを宣言します。
class StringOrInt[T]
object StringOrInt {
implicit object IntWitness extends StringOrInt[Int]
implicit object StringWitness extends StringOrInt[String]
}
次に
foo
このように
object Bar {
def foo[T: StringOrInt](x: T) = x match {
case _: String => println("str")
case _: Int => println("int")
}
}
で、終わりです。を呼び出すことができます。
foo(5)
または
foo("abc")
で、うまくいくのですが、試しに
foo(true)
となり、失敗します。これは、クライアントコードが
StringOrInt[Boolean]
で指摘されているように
ランドール
を作成します。
StringOrInt
a
sealed
クラスがあります。
という理由で動作します。
T: StringOrInt
という型の暗黙のパラメータがあることを意味します。
StringOrInt[T]
Scalaはある型のコンパニオンオブジェクトの内部を調べて、その型を求めるコードが動作するように暗黙の了解があるかどうかを確認するからです。
関連
-
[解決済み] Scalaでステートメントの間にN秒待つには?
-
[解決済み] スパークSPLラウンド&ブラウンド
-
[解決済み] Spark - Sparkでパーセンタイルを計算する方法は?
-
[解決済み】Scalaのvarとvalの定義の違いは何ですか?
-
[解決済み】タイプセーフのenum型をモデル化する方法は?
-
[解決済み】関数を定義する "def "と "val "の違いとは?
-
[解決済み】Scalaでリスト内のアイテムを取得する?
-
[解決済み】ScalaのfoldLeftとreduceLeftの違いについて
-
[解決済み] Scalaは、コレクションをMap-by-keyに変換する最良の方法ですか?
-
[解決済み] データセットにカスタムオブジェクトを格納する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Scala underscore - ERROR: 展開された関数のパラメータ型が見つかりません。
-
[解決済み] GSON JsonObject "Unsupported Operation Exception: null" getAsString
-
[解決済み] TimeoutExceptionが発生した場合、どのような原因が考えられるでしょうか。Sparkで作業しているときに[n秒]後にFuturesがタイムアウトしました[重複]。
-
[解決済み] MapのmapValuesとtransformの違いについて
-
[解決済み] Scalaのリターン
-
[解決済み] self-typesとtrait subclassの違いは何ですか?
-
[解決済み] 縮小、折りたたみ、スキャン(左/右)?
-
[解決済み] Scalaの識別子 "implicitly "とは?
-
[解決済み] データセットにカスタムオブジェクトを格納する方法は?
-
[解決済み] Scala における `#` 演算子の意味とは?