__getattr__ / __setattr__
Python (および他のメソッド)に相当するscalaはあり__*__
ますか?いくつかの組み込みまたは多分いくつかの特性?
2 に答える
そして、新しい 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__
⇝length
、size
またはコンテナー内の規則は何でも__getitem__
→apply(i: IndexType)
// コンテナーは Scala の関数です__setitem__
→update(i: IndexType, v: ValueType)
__delitem__
// 特別な処理は必要ありません。コンテナコンベンション__iter__
→foreach(block: ValueType => Unit)
// 戻り値:map
,flatMap
特に、apply
とupdate
は、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の統一されたアクセス原理は、「フィールド」とメソッドが同じインターフェースを共有することを意味します。実際、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で利用可能になりますが、この機能は危険であることを人々に警告するフラグの後ろにあります(動的型付けが導入されているためですが、動的型付けが危険であると思わない場合は、大丈夫)。