web-dev-qa-db-ja.com

Scalaマップ->演算子

記号は何ですか->は、ScalaのMapのコンテキストで意味しますか?

ScalaのPredefクラスは、key -> valueペアの代替構文として(key, value)。 ScalaByExampleでそれを読みましたが、これがマップでどのように機能するかはわかりません。

36
Kamil

->演算子は、マップのコンテキストで使用される場合に、キーを値に関連付けるための省略形です。一部の言語では、キーと値のペア(通常は最初の位置にキーがあり、2番目の値にある)をコンストラクタまたはマップ上のさまざまなメソッドの1つに渡すだけで、処理されます。適切に-これはScalaマップでも許可されます。

ただし、Scalaはkey -> valueの省略形も提供します。これは、ご存じのとおり、Predefで暗黙的に定義されており、関連付けをより明確にします。本質的には、「左側のアイテムを取り、それを右側のアイテムにマッピングします。」Mapオブジェクトの定義を読むと、明らかに使用するメソッドが定義されていないことがわかりますthis ->メソッド。代わりに、メソッドはTuple2タイプのオブジェクトを取ります(これは2つの値のタプルです:(item1, item2))。これは、暗黙的にScala= Predefのメソッドで変換します。

一部の言語では、->構文は言語自体の一部として定義されていますが、Scalaの柔軟性により、これはメソッドとして簡単に定義できます。

50
Thomas Lockney

暗黙の変換は次のとおりです。

implicit def any2ArrowAssoc[A](x: A): ArrowAssoc[A] = new ArrowAssoc(x)

これにより、任意のタイプが「ArrowAssoc」のインスタンスに変換されます

class ArrowAssoc[A](x: A) {
    def -> [B](y: B): Tuple2[A, B] = Tuple2(x, y)
}

Scalaが見たとき

"a"->1

「文字列には「->」という名前のメソッドはありません。「->」という名前のメソッドを持つ型を取得できるスコープ内の暗黙の変換はありますか?」 Predef.scalaは自動的にスコープ内にあり、明らかに「->」メソッドを持つArrowAssocへの変換を提供します。 Scala次に、基本的に上記を

any2ArrowAssoc("a").->(1)

このメソッドは、Tuple2( "a"、1)(しばしばペアと呼ばれます)を返します。 Mapには、Tuple2の配列(可変引数)であるコンストラクターがあるため、レースに取り掛かります!コンパイラーには魔法がありません(暗黙的に変換されますが、これは広範囲におよびさまざまな目的で使用されます)。Mapsコンストラクターにも魔法はありません。

71
Adam Rabung

_->_は、マップのキーと値を結合するために使用されます。そう:

_val m = Map(1 -> "one", 2 -> "two", 3 -> "three")
_

最初の3つの正の整数を同等のテキストにマップします(つまり、m(1)は_"one"_などになります)。次のように書くこともできます

_val m = Map((1,"one"), (2,"two"), (3,"three"))
_

しかし、最初の方法は見栄えが良いため、代替手段として提供されています。

14
Rex Kerr

アダムが言ったように、->scala構文ではなく、クラスArrowAssocのメソッドです。 "foo"-> "bar"と記述すると、コンパイラは "foo"からArrowAssocインスタンスへの暗黙の変換を挿入し、->メソッドが見つかります。

package scala
object Predef {
   class ArrowAssoc[A](x: A) {
       def -> [B](y: B): Tuple2[A, B] = Tuple2(x, y)
      }
      implicit def any2ArrowAssoc[A](x: A): ArrowAssoc[A] =
        new ArrowAssoc(x)
      ...
}

グーグル「より多くを知るために「スカラ豊富なラッパー」。

1
maow