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 的有效使用。

编辑

我知道匿名函数字符串中不需要打开 { 和关闭 },它就像 Jasmine 这样的东西。

编辑

pseudo anonymous function实际上是一个测试,这意味着在测试结束时,有类似的东西

[[ var == 'foo' ]]

或者

((i > 10))

即某种测试(或断言,在 XUnit 术语中)。除了返回代码之外,它永远不需要返回任何内容,然后返回代码被评估,如果返回代码为 0(成功),则描述以绿色打印,否则以红色打印(测试失败)。

4

3 回答 3

4

对于一次性使用的“匿名”函数,我使用以下约定在函数范围内执行 bash 脚本:

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

虽然不是真正的匿名,但这类似于 JavaScript 中的IIFE(立即调用函数表达式)习语。

Bash 函数必须有名称。您可以使用您喜欢的任何名称(main这是一个流行的选择。)我更喜欢单个下划线_,因为 a)它很短,并且 b)它通常在许多语言中用于表示一次性值。

于 2014-07-02T18:41:31.650 回答
3

我认为这不是 eval 的有效案例。匿名函数在某些情况下很有用:我想到了闭包柯里化和回调(意料之外的头韵)。这个实现没有给你这些权力,因为你的 eval 伪函数仍然不能返回一个值(除了 0-255 退出状态),并且绝对不能返回另一个匿名函数。

于 2012-09-06T12:09:00.190 回答
1

如果它完成了工作并且您(以及理想情况下的其他人)完全了解它的工作原理。

我已经为测试用例自动化编写了不止一次或两次类似的代码,但我承认它可能会变得很麻烦,特别是如果你从简单开始,然后让它有机地发展。

对于它的价值,我想建议在风格上进行改进;

if eval "$2"; then
  # something

或者如果“某事”是一个简单的命令,那么简单

eval "$2" && # something

话虽如此,如果您可以eval完全避免这种情况可能会更好,但这取决于您的测试用例。

$2 && # something
于 2012-09-06T13:18:46.557 回答