次のような作品です。
フィールドを「private[this]」にすると、目的のフィールド参照( "getfield")になります。
別のインスタンスからのアクセスは、アクセサ「state()」を介して行われます。これを@inlineにすると、フィールドへのアクセス制限が緩和されます。
これは、アップデーター(コンパニオンモジュールにたまたま存在する)もそれにアクセスできることを意味します。
(varの通常のアクセサーはobject-privateメンバーには発行されないため、parensを使用して独自のアクセサーを定義できます。ただし、呼び出しサイトother.stateでparensを使用する必要はありません。統一アクセスの原則はドルです。職場で。またはスイスフラン。)
`new`
また、パラメータ名のバックティックでの完全にヒップな使用法にも注意してください。このマークアップにダニを表示する方法すらわかりません。両方のパラメーターが同じタイプであるため、1つは書きたいと思う可能性が高いcas(expect=prev, `new`=changed)
ので、代わりに使用した可能性がありますnext
が、このマークアップが流行に敏感な親指を立てるのをサポートしている場合は、今すぐ提供します。:+1:動作しましたか?誰かが私の親指を見ることができますか?[私はそれをgithubで見たと思います。ヒップスターではなく、ハブスター。]
object IVar {
// TODO: retrieve mangled name by reflection
private final val stateField = "com$twitter$concurrent$IVar$$state"
private val stateUpd = AtomicReferenceFieldUpdater.newUpdater(
classOf[IVar[_]], classOf[State[_]], stateField)
}
final class IVar[A] { //}extends IVarField[A] {
import IVar._
@volatile private[this] var state: State[A] = initState: State[A]
@inline private final def state(): State[A] = this.state
override def toString = "Ivar@%s(state=%s)".format(hashCode, state)
@inline private[this]
def cas(expect: State[A], `new`: State[A]) = stateUpd.compareAndSet(this, expect, `new`)
def depth: Int = {
@tailrec
def loop(iv: IVar[_], d: Int): Int = iv.state match {
case Linked(iv) => loop(iv, d + 1)
case _ => d
}
loop(this, 0)
}
// etc
}
そのstate()を表示することは実際にインライン化されています:
private final int loop$1(com.twitter.concurrent.IVar, int);
flags: ACC_PRIVATE, ACC_FINAL
Code:
stack=3, locals=5, args_size=3
0: aload_1
// Field com$twitter$concurrent$IVar$$state:Lcom/twitter/concurrent/ivar/State;
1: getfield #16
4: astore_3
「自分の質問をして答えてもいい」だけでなく、
https://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/
それは無限に満足です。
(ダニエル・ソブラル、レックス・カー、レトロニム、その他のジャスティス・リーグにさらに力を。)