5

bashにはファーストクラスの関数がないため、関数に文字列を渡して無名関数をシミュレートしています。関数は、によって評価されevalます。

it() {
    echo "$1" # prints the description of the spec
    beforeEach # a setup function
    eval "$2"

    if (($? == 0)); then
        # do something
    fi

    afterEach  # a cleanup function
}

it "should echo something" '{
  echo "something"
}'

これにより、非常に簡潔なテストを作成できます(仕様を定義します)。これがevalの有効な使用法であるかどうか疑問に思います。

編集

匿名関数文字列では開始{と終了}は必要ないことを認識しています。それは、ジャスミンのようなものに似ているということです。

編集

これpseudo anonymous functionは実際にはテストです。つまり、テストの最後に次のようなものがあります。

[[ var == 'foo' ]]

また

((i > 10))

つまり、ある種のテスト(または、XUnit用語ではassert)です。次に評価される戻りコード以外のものを返す必要はありません。戻りコードが0(成功)の場合、説明は緑色で出力され、それ以外の場合は赤色で出力されます(テストは失敗しました)。

4

3 に答える 3

4

1回限りの「匿名」関数の場合、次の規則を使用して、関数スコープでbashスクリプトを実行します。

#!/usr/bin/env bash
_() {
  #...
} && _ "$@"
unset -f _

真に匿名ではありませんが、これはJavaScriptのIIFE(即時呼び出し関数式)イディオムに似ています。

Bash関数には名前が必要です。好きな名前を使用できます(main一般的な選択肢です)。a _)短く、b)使い捨ての値を示すために多くの言語で従来から使用されているため、単一のアンダースコアを使用します。

于 2014-07-02T18:41:31.650 に答える
3

私はそれがevalの有効なケースではないと思います。匿名関数は、いくつかの場合に役立ちます。クロージャカリー化、およびコールバックが思い浮かびます(意図しない頭韻法)。評価された疑似関数はまだ値(0〜255の終了ステータス以外)を返すことができず、別の無名関数を確実に返すことができないため、この実装ではこれらの機能は提供されません。

于 2012-09-06T12:09:00.190 に答える
1

それが仕事を成し遂げ、あなた(そして理想的には他の人)がそれがどのように機能するかを完全に理解しているなら。

私はテストケースの自動化のために同様のコードを1、2回以上書いてきましたが、特に単純なものから始めて有機的に成長させると、かなり厄介になる可能性があることを認めます。

その価値については、文体の改善を提案したいと思います。

if eval "$2"; then
  # something

または、「何か」が単純なコマンドである場合は、

eval "$2" && # something

evalそうは言っても、完全に回避できれば良いかもしれませんが、これはテストケースによって異なります。

$2 && # something
于 2012-09-06T13:18:46.557 に答える