由于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(成功),描述将以绿色打印,否则为红色(测试失败)。
答案 0 :(得分:3)
我不认为这是eval的有效案例。在以下几种情况下,匿名函数很有用:closures,Currying和callbacks会浮现在脑海中(无意识的头韵)。这个实现没有给你这些功能,因为你的eval'ed伪函数仍然不能返回一个值(除了0-255退出状态),并且肯定不能返回另一个匿名函数。
答案 1 :(得分:2)
对于一次性使用“匿名”函数,我使用以下约定在函数范围内执行bash脚本:
#!/usr/bin/env bash
_() {
#...
} && _ "$@"
unset -f _
虽然不是真正的匿名,但这类似于JavaScript中的IIFE (Immediately-Invoked Function Expression)习语。
Bash函数必须具有名称。您可以使用任何您喜欢的名称(main
是一个受欢迎的选择。)我更喜欢单个下划线_
因为a)它很短而b)它通常用于许多语言中以表示一次性值。< / p>
答案 2 :(得分:1)
如果它完成了工作,你(以及理想的其他人)完全理解它是如何工作的。
我一直在为测试用例自动化编写类似的代码超过一次或两次,但我承认它会变得非常毛茸茸,特别是如果你开始简单然后允许它有机增长。
对于它的价值,我想建议一种风格改进;
if eval "$2"; then
# something
或者如果“某事”是一个简单的命令,那么普通的
eval "$2" && # something
话虽如此,如果你完全避免使用eval
可能会更好,但这取决于你的测试用例。
$2 && # something