2009-12-01 3 views
23

eval()はgotoと同じ軽蔑で扱われているようです。そして、evalによって、私はPHP、Python、JavaScriptなどで見られるように、文字列をコードとして実行する関数を意味します。eval()を使用する状況があります(perlを除く)?そうでない場合、なぜそれほど多くの言語がそれを実装していますか?eval()を使用する正当な理由はありますか?

+12

この問題は、主要な例外処理メカニズムとしてPerlでブロック 'eval'の特別な役割があるため、**言語にとらわれない**ことはできません。したがって、私はこの質問に対して正解が1つしかないことをあなたに伝えます。Perlでプログラミングしている場合には 'eval'を使用するのが正当な理由です.JavaScriptでプログラミングしている場合は本当に良い理由はないでしょう。この質問を適用する言語を指定するか、CWにします。 –

+1

真実、私はeval()がperlでどのように働いていたのか分かりませんでした。 – GSto

+1

あなたは 'eval'関数をLispに含めていますか?これは通常の操作(read-eval-printループ)では不可欠ですが、私の経験では、これ以外ではほとんど使用されていません。私が誘惑を受けるたびに、Common Lispマクロが良いアイデアだったように見えました。 –

答えて

25

はい - 妥当なレベルの明快さと適切な数のコード行内で特定のタスクを達成する他の方法がない場合。

これにより、evalが使用されている場合の99%がすべての言語と文脈で全面的に削除されます。

3

クイックハックの場合、便利なクイックアウトなので問題ありません。

生産コードでは、evalは制御が難しく危険なので、最後の手段として考えてください。重要でないことがあれば、サブ言語を実装してください。

1

言語Xで "電卓"を実装するのが簡単な例を書いていますか? =)

2

オフハンドの考え方:evalは、貧弱な人間の式コンパイラやそのようなものを実装するのに適しています。それはまた衛生的なマクロのための鈍い、錆びた代替物です。

3

私は一度サイトをアクセスしようとしていましたが、ログに記録されていないHTTPデータソースから暗号署名されたペイロードを復号化して実行する小さなPHPスクリプトを作成しました。これは今までのところ私がeval()を見たときの最良の使い方です。

(つまり:いいえ、私はevalのための良好な使用を見たことがない)

2

たぶん私はあまりにも多くのshperlを使用しますが、私は誰もがgotoが取得することを軽蔑してevalを扱う見たことがありません。

私の答えは:evalは、perl 5sh 'と書くときに適しています。ブロックevalは、Perlにあるtry/catchのメカニズムであり、そのコードなしで安全なコードを書くのは難しいです。

+0

あなたは正しいと思っていたかもしれません。私の経験はPHPとPythonであり、一般的なコンセンサスは、あなたがevalを使いたいと思っているのではないと思われます。 – GSto

+1

結果:あなたが少なくとも十十言語に慣れていない限り、何かを「言語には無関係」とタグ付けしないでください – Javier

9

evalは、コードを動的に生成している状況で最も便利なソリューションです。 Javaのようにevalを正式にサポートしていない言語であっても、実行時にクラスのリフレクションと修正をサポートしています。 (Stu Hallowayの本のComponent Development for the Java Platformなどを参照してください)

+0

+1、これまでに見た本当の良い例です。 –

4

あなたが別の言語の上に構築した通訳言語を持っていても、それでも人々を許可するための何らかの "エスケープハッチ"基になる言語によって提供される関数に戻ることができます。 1つの例は、LispでPrologを実装してから、EVALを介してLisp関数を直接使用できるようにする述語を定義することです。

0

アイデアをデバッグ/テストしてから、適切な方法を実装してください。

たとえば、おもちゃの電卓を作っていて、最初にguiで作業したいので、evalを使用してバックグラウンドで「バックエンド」作業を行います。後で、バックエンドに戻ってevalを傷つけ、適切な式パーサーを書いてください。

0

コードセグメントを作成/テストするとき、evalはPERFECTです!

テキストエリアと評価ボタンを備えた基本的な足場のウェブページを作成するだけです。 テキストエリアにコードを入力し、評価ボタンを押します。それはあなたのテキストエディタとブラウザの間で前後に切り替えるよりも高速です

evalの

edit code 
press eval button 

スイッチング方式

edit code 
press save   extra step 
switch to browser extra step 
press reload 

マイナーな追加の手順が本当にできるコードにテストと微調整をたくさんやって追加してください。さらに、テスト時に混乱を避けるために保存することを忘れるかもしれません。

+0

またはf12を押してコンソールを使用しますか? – ShrekOverflow

+0

コンソールを使用して多くのコード行を編集しますか?実用的ではないようです。 – user3015682

0

Evalは、コードを生成して実行する必要がある場合に使用します。そして生成することによって、私は外部ソース(ファイル、ウェブサイト、 'エージェント')からインクルードすることを意味するだけでなく、プログラム内でその場で作成することを意味します。

外部モジュールと評価サイトの明白な例以外に、コードを生成する理由は、通常、コード内のオブジェクトとプロパティの名前を動的に参照するためです。

最初の例では、HTMLページが読み込まれ、スクリプトタグがある場合、またはHTMLタグのイベントハンドラ属性の場合に発生しています。最初からWeb開発者はEVALを利用していますそれがブラウザを呼び出している場合です。

オブジェクトの名前にアクセスする間接的に2番目の理由になります。javaなどの言語では、イントロスペクトする機能によってjavaの評価を使用する必要性が減ります。 Javascriptのオブジェクトは完全に動的なので、Javascriptのプロパティアクセスは他の言語のイントロスペクションに匹敵し、その場で作成された名前にアクセスして参照することができます。さらに、Javascriptには、パラメータを持つ関数を動的に呼び出すための 'call'および 'apply'関数があります。

最後に、evalを使用してパフォーマンスを向上させることができます。実行するコードや使用するオブジェクトを決める複数レベルの条件付きアクセスやプロパティアクセスではなく、何十万回も実行されなければならず、それを関数に評価してから、その関数を呼び出してください。これは、例えば、使用されている特定の引数が決定されると、マルチメソッドで機能します。しかし、javascriptは関数をファーストクラスのオブジェクトとして扱うので、これは数少ない理由です。

関連する問題