問題タブ [name-binding]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
155 参照

c++ - 参照によるラムダキャプチャがまだダングリング参照で機能しているのはなぜですか?

驚いたことに、次の C++ プログラム:

出力:

コメント行のコメントを外したときに得られる出力と同じ出力が期待できます。

ラムダは参照によって(ではなく)f自動変数をキャプチャし、呼び出しの時点でコンテキストにないため(したがって、本体はダングリング参照です)。x xf()xf

参照によるラムダキャプチャがまだダングリング参照で機能しているのはなぜですか?

0 投票する
0 に答える
57 参照

r - R パッケージの「プライベート」オブジェクトを保護する

動機

pkg関数呼び出しによって生成されたいくつかのオブジェクトを実行中のキャッシュに収集する R パッケージ (と呼びます) を開発しています。名前空間でキャッシュをオブジェクトとして実装するのは簡単ですlist(それを と呼びます.cache) 。pkgただし、ユーザーがキャッシュに直接干渉するのを防ぎたいと思います。これは、:::構文を介して常に公開できますpkg:::.cache

つまり.cache、オブジェクト指向プログラミングのプライベート フィールドと同様に保護したいと考えています。すべての操作は、「API フレーバー」を持つ ed 関数.cacheによって排他的に呼び出される内部ヘルパー関数によって実行する必要があります。@export

問題

そのため、名前空間でオブジェクトを定義するenvironment(それを と呼ぶ) という考えがあったので、... myを my に.vault入れることができます。.cache.vault

3

私の困惑は、次のような環境が R で参照によって.vault機能する数少ないものの 1 つであるということです。そのため、またはその内容を表示だけでなく変更にも公開することを恐れています。アクセサー関数を変更して、そのような露出を有効しないようにすることはできますが、その場で直接変更できる場合、そのような努力はすべて無駄です。pkg:::.vault.vaultpkg:::.get_cache().vault

走るな

例として、以下の危険な(?) コードについて考えてみましょう。最初に、「ターゲットを特定する」ために.S3MethodsClassesから内部環境を調べます。dplyr

次に、オブジェクトを調べrowwise_dfて、価値のある「ターゲット」と見なします。

dplyr最後に、名前空間のほとんどのオブジェクトとは異なり...

... .S3MethodsClasses points by referenceのような環境なので、その内容をその場で簡単に変更できます。

そのまま「金庫」が奪われる!

疑惑

答えはlockEnvironment()友人と一緒にここにあるのではないかと思いますが、アプリケーションは私を少し超えています. おそらく、環境.onLoadをセットアップするために何かを行うことができます。これは、それ自体とその中のバインディングの両方を edにしますが、名前空間内に入力される とアクセサー functionの間のアクティブなバインディングを作成する前ではありません。.vaultlock*().vault.cache.get_cache()pkg

ノート

名前空間.get_cache()から仲間の関数の外部で呼び出されたときのように、(ヘルパー) 関数を終了する機能を既に開発しています。pkgしたがって、 を公開するpkg:::.get_cache()と、ユーザーは.get_cache()手動で操作したり、独自のカスタム関数で操作したりできなくなります。

正規性

正規の回答を提供するのに十分な経験を積んだ R 開発者のアドバイス (もしあれば) に特に感謝します。