eval()
はgotoと同じ軽蔑で扱われているようです。そして、eval
によって、私はPHP、Python、JavaScriptなどで見られるように、文字列をコードとして実行する関数を意味します。eval()
を使用する状況があります(perlを除く)?そうでない場合、なぜそれほど多くの言語がそれを実装していますか?eval()を使用する正当な理由はありますか?
答えて
はい - 妥当なレベルの明快さと適切な数のコード行内で特定のタスクを達成する他の方法がない場合。
これにより、eval
が使用されている場合の99%がすべての言語と文脈で全面的に削除されます。
クイックハックの場合、便利なクイックアウトなので問題ありません。
生産コードでは、eval
は制御が難しく危険なので、最後の手段として考えてください。重要でないことがあれば、サブ言語を実装してください。
言語Xで "電卓"を実装するのが簡単な例を書いていますか? =)
オフハンドの考え方:evalは、貧弱な人間の式コンパイラやそのようなものを実装するのに適しています。それはまた衛生的なマクロのための鈍い、錆びた代替物です。
私は一度サイトをアクセスしようとしていましたが、ログに記録されていないHTTPデータソースから暗号署名されたペイロードを復号化して実行する小さなPHPスクリプトを作成しました。これは今までのところ私がeval()を見たときの最良の使い方です。
(つまり:いいえ、私はevalのための良好な使用を見たことがない)
たぶん私はあまりにも多くのsh
とperl
を使用しますが、私は誰もがgoto
が取得することを軽蔑してevalを扱う見たことがありません。
私の答えは:eval
は、perl 5
とsh
'と書くときに適しています。ブロックeval
は、Perl
にあるtry
/catch
のメカニズムであり、そのコードなしで安全なコードを書くのは難しいです。
evalは、コードを動的に生成している状況で最も便利なソリューションです。 Javaのようにevalを正式にサポートしていない言語であっても、実行時にクラスのリフレクションと修正をサポートしています。 (Stu Hallowayの本のComponent Development for the Java Platformなどを参照してください)
+1、これまでに見た本当の良い例です。 –
あなたが別の言語の上に構築した通訳言語を持っていても、それでも人々を許可するための何らかの "エスケープハッチ"基になる言語によって提供される関数に戻ることができます。 1つの例は、LispでPrologを実装してから、EVAL
を介してLisp関数を直接使用できるようにする述語を定義することです。
アイデアをデバッグ/テストしてから、適切な方法を実装してください。
たとえば、おもちゃの電卓を作っていて、最初にguiで作業したいので、eval
を使用してバックグラウンドで「バックエンド」作業を行います。後で、バックエンドに戻ってeval
を傷つけ、適切な式パーサーを書いてください。
コードセグメントを作成/テストするとき、evalはPERFECTです!
テキストエリアと評価ボタンを備えた基本的な足場のウェブページを作成するだけです。 テキストエリアにコードを入力し、評価ボタンを押します。それはあなたのテキストエディタとブラウザの間で前後に切り替えるよりも高速です
evalの
edit code
press eval button
スイッチング方式
edit code
press save extra step
switch to browser extra step
press reload
マイナーな追加の手順が本当にできるコードにテストと微調整をたくさんやって追加してください。さらに、テスト時に混乱を避けるために保存することを忘れるかもしれません。
またはf12を押してコンソールを使用しますか? – ShrekOverflow
コンソールを使用して多くのコード行を編集しますか?実用的ではないようです。 – user3015682
Evalは、コードを生成して実行する必要がある場合に使用します。そして生成することによって、私は外部ソース(ファイル、ウェブサイト、 'エージェント')からインクルードすることを意味するだけでなく、プログラム内でその場で作成することを意味します。
外部モジュールと評価サイトの明白な例以外に、コードを生成する理由は、通常、コード内のオブジェクトとプロパティの名前を動的に参照するためです。
最初の例では、HTMLページが読み込まれ、スクリプトタグがある場合、またはHTMLタグのイベントハンドラ属性の場合に発生しています。最初からWeb開発者はEVALを利用していますそれがブラウザを呼び出している場合です。
オブジェクトの名前にアクセスする間接的に2番目の理由になります。javaなどの言語では、イントロスペクトする機能によってjavaの評価を使用する必要性が減ります。 Javascriptのオブジェクトは完全に動的なので、Javascriptのプロパティアクセスは他の言語のイントロスペクションに匹敵し、その場で作成された名前にアクセスして参照することができます。さらに、Javascriptには、パラメータを持つ関数を動的に呼び出すための 'call'および 'apply'関数があります。
最後に、evalを使用してパフォーマンスを向上させることができます。実行するコードや使用するオブジェクトを決める複数レベルの条件付きアクセスやプロパティアクセスではなく、何十万回も実行されなければならず、それを関数に評価してから、その関数を呼び出してください。これは、例えば、使用されている特定の引数が決定されると、マルチメソッドで機能します。しかし、javascriptは関数をファーストクラスのオブジェクトとして扱うので、これは数少ない理由です。
- 1. TCP/IP経由のUnixソケットをmysqlで使用する正当な理由はありますか?
- 2. JavaScriptがインラインになるのに正当な理由はありますか
- 3. 静的メソッドを隠す正当な理由はありますか?
- 4. JVMアプリケーションの場合、Elasticsearch REST APIを使用する正当な理由はありますか?
- 5. Optional.of()を使用する本当の理由はありますか?
- 6. "疑似typedef反パターン"の正当な理由はありますか?
- 7. まだCVSを使用する理由はありますか?
- 8. JSONPを使用しない理由はありますか?
- 9. OrientDBを使用しない理由はありますか?
- 10. ワイルドカードを使用しない理由はありますか?
- 11. Boost :: shared_ptrsを使用しない理由はありますか?
- 12. vbscript evalに相当するvb.net eval関数はありますか
- 13. ロックファイルをflockで使用する理由はありますか?
- 14. selfキーワードを使用する理由はありますか?
- 15. varをもう使用する理由はありますか?
- 16. [:over @ :?を使用する理由はありますか?
- 17. スウィフトでセレクタを使用する理由はありますか?
- 18. VBAでENUMを使用する理由はありますか?
- 19. オブジェクトコンストラクタの正当な使用はありますか?
- 20. Pythonで書かれたアプリをC#に変換する正当な理由はありますか?
- 21. レガシーコードはconstポインタを変更します。正当な理由はありますか?
- 22. JavaScriptでObject.create()またはnewを使用する理由はありますか?
- 23. XMLの代わりにSGMLを使用する理由はありますか?
- 24. PyMem_Mallocよりmallocを使用する理由はありますか?
- 25. trueの代わりに!0を使用する理由はありますか?
- 26. LinqよりエンティティSQLを使用する理由はありますか?
- 27. Androidアプリは正当な理由なしに起動時にクラッシュすることがあります
- 28. NSMutableDictionaryを使用するとNSNotificationCenterがクラッシュする理由はありますか?
- 29. 関数にINLINABLEプラグマを使用しない理由はありますか?
- 30. アンドロイドスタジオでロンボクを使用しない理由はありますか
この問題は、主要な例外処理メカニズムとしてPerlでブロック 'eval'の特別な役割があるため、**言語にとらわれない**ことはできません。したがって、私はこの質問に対して正解が1つしかないことをあなたに伝えます。Perlでプログラミングしている場合には 'eval'を使用するのが正当な理由です.JavaScriptでプログラミングしている場合は本当に良い理由はないでしょう。この質問を適用する言語を指定するか、CWにします。 –
真実、私はeval()がperlでどのように働いていたのか分かりませんでした。 – GSto
あなたは 'eval'関数をLispに含めていますか?これは通常の操作(read-eval-printループ)では不可欠ですが、私の経験では、これ以外ではほとんど使用されていません。私が誘惑を受けるたびに、Common Lispマクロが良いアイデアだったように見えました。 –