4

__getattr__ / __setattr__Python (および他のメソッド)に相当するscalaはあり__*__ますか?いくつかの組み込みまたは多分いくつかの特性?

4

2 に答える 2

11

そして、新しい Scala 2.10 リフレクション API について詳しい洞察力を持つ誰かが説明するまで待つ必要が__getattr__あり__setattr__ます。(そしてもちろん、直接翻訳できるわけではありません。ユースケースに完全に依存します。動的クラスが必要なDynamic場合は、将来的に特性があります。そのほんの少しが必要な場合は、パターン マッチングを中心に設計することは、当然の選択かもしれません。)

Pythonの__*__の多数のメソッドについては、次のとおりです。

グローバルなこと

  • __call__apply()// 動作はほぼ同じ
  • __metaclass__// ユースケースに依存:
    • 現在、class継承またはtraitミックスインが役立つ場合があります
    • 多くの場合、メタクラスが行うのは、への呼び出しを回避するインスタンス構築だけsuper()です。in Scalasuper()は常にコンストラクターで呼び出されます。
  • __repr____str__toString()
  • __eq__equals()
  • __init__// クラス本体で暗黙的に呼び出される
  • __new__// 直接存在しません。ユースケースに応じて早期初期化
  • __del__//行方不明
  • __nonzero__// そうではありませんが、implicit def toBool[MyType](a: MyType): Boolean = ...

コンテナの種類

  • __len__lengthsizeまたはコンテナー内の規則は何でも
  • __getitem__apply(i: IndexType)// コンテナーは Scala の関数です
  • __setitem__update(i: IndexType, v: ValueType)
  • __delitem__// 特別な処理は必要ありません。コンテナコンベンション
  • __iter__foreach(block: ValueType => Unit)// 戻り値: map,flatMap

特に、applyupdateは、Python の対応物と同様に、Scala では特別です。次の構文を使用できます。

val x = collection(elem) // val x = collection.apply(elem)
collection(elem) = y // collection.update(elem, y)

同様に、ちょうど Python__iter__が構文 like(el for el in container) foreachを許可し、mapと言うことができるようにしますfor (el <- container) yield el

オペレーター

通常、これらを直接定義できるため、特別な処理は必要ありません

  • __add__, __sub__, … // 定義def + (arg: T)またはdef - (arg: T)

これには比較演算子も含まれます

  • __lt____ge__def <(other: T)def <=(other: T)

ただし、Python と同様に、コンパイラには高度な処理を行うための特殊なケースがいくつかあります。

  • __radd__, __rsub__, … // 右結合演算子。約。def +: (arg: T)またはdef -: (arg: T)( を追加:)
  • __iadd__, __isub__, … // 演算子の変更: def += (arg: T), …</li>

コンテキストマネージャー

  • __enter__, __exit__// ほとんどの場合、関数の引数は同じ目的を果たします

参照: Scala の「マジック」関数のリスト

于 2012-05-18T21:19:27.050 に答える
2

ここで何がポイントなのかわかりません。Scalaの統一されたアクセス原理は、「フィールド」とメソッドが同じインターフェースを共有することを意味します。実際、Scalaの「フィールド」はゲッターとセッターであるためです。

つまり、次のように置き換えることができます。

var x: Int = 0

private[this] var _x = 0
def x = _x
def x_=(n: Int) { _x = n }

getterメソッドとsetterメソッドは、宣言したプライベートフィールドへのアクセスを制御します。

ここで、非静的フィールドを提供する方法だけが必要な場合は、動的特性を確認する必要があります。2.9.2までは実験的ですが、2.10で利用可能になりますが、この機能は危険であることを人々に警告するフラグの後ろにあります(動的型付けが導入されているためですが、動的型付けが危険であると思わない場合は、大丈夫)。

于 2012-05-18T23:17:28.970 に答える