我正在尝试创建一个ruby脚本来帮助我在linux终端上运行一些C ++测试。对于Ruby来说,我是一个初学者,并且遇到了一些问题。 我已经定义了一个名为" tfailed"的全局变量数组,但是当我尝试进入它时会出现此错误:
mscr.rb:18:in `runTest': undefined method `-@' for ["Card_test_all"]:Array (NoMethodError)
有问题的代码在这里:
$trun=0;
$tpassed=0;
$tfailed=Array.new;
def runTest(testname)
puts "Running #{testname}";
if system("make " + testname + ".exe > /dev/null") then
puts "#{testname} compiled correctly.";
end
succ=system("./"+testname+".exe > /dev/null");
$trun=$trun+1;- #typo was here
if(succ)
$tpassed=$tpassed+1;
puts (testname + " successfully run.");
else
puts (testname + " unsuccessfully run.");
$tfailed << testname; #LINE 18 here
end
puts "-------------------------------";
end
如果C ++程序没有成功运行,则应将测试名称推送到数组中。在这种情况下,调用的函数是
runTest("Card_test_all");
代码应该按字符串&#34; Card_test_all&#34;进入$ tfailed数组,但它给了我上面的错误。如何解决这个问题的任何帮助或想法将不胜感激。
编辑:添加导致问题的行号。另外,感谢以下评论员提供的ruby样式/语法建议。
编辑2:我在第一次改变中编辑的拼写错误实际上是问题。我是个白痴。谢谢你的帮助。
答案 0 :(得分:1)
除了全局变量和不必要的分号之类的风格问题之外,问题的根源是第11行末尾的-
。这是因为在Ruby中,任何语法上有效的一块代码都会计算为除了具有任何效果之外,还可以用于进一步操作的值。请注意,有些内容,例如puts
评估为nil
,您无法使用(puts
执行 ton 只是一个方法调用,并且它会进行评估为零,因为该方法返回nil)。
特别是,if ... else ... end
块计算执行代码的最后一行计算结果。所以,而不是说
if a == 1
x = "foo"
else
x = "bar"
end
你可以完全合法地写
x = if a == 1
"foo"
else
"bar"
end
if
评估为“bar”,因此x
变为“bar”。
所以,你的第二个if语句如下所示:
if(succ)
$tpassed=$tpassed+1;
puts (testname + " successfully run.");
else
puts (testname + " unsuccessfully run.");
$tfailed << testname;
end
由于succ
为false,因此会评估else分支:
puts (testname + " unsuccessfully run.");
$tfailed << testname;
这里的最后一行是$tfailed << testname
。 $tfailed
是一个数组,the <<
method on Array修改有问题的数组然后返回它。因此,当succ
为false时,整个if
语句将计算为$tfailed
中保存的数组。
现在,如果你想要的话,Ruby语句可以包含多行。如果你写了
x =
if(succ)
$tpassed=$tpassed+1;
puts (testname + " successfully run.");
else
puts (testname + " unsuccessfully run.");
$tfailed << testname;
end
然后您已将变量x
设置为$tfailed
。但是,你有效地写了
-
if(succ)
$tpassed=$tpassed+1;
puts (testname + " successfully run.");
else
puts (testname + " unsuccessfully run.");
$tfailed << testname;
end
那是在尝试查找-$tfailed
,即负$tfailed
。一元前缀减去'负'运算符表示为-@
,以区别于二进制中缀减去'减法'运算符-
,如果您愿意,可以在任何类上定义。但是,数组不定义一元减号运算符。所以,这是一个NoMethodErorr:未定义的方法 - @“for [”Card_test_all“]:Array。
编辑:哎呀,当我输入我的答案时,问题被编辑了,第11行的-
不再存在。你确定写的代码仍然会引发声明的异常吗?