未定义的方法` - @'当试图将字符串推入数组时

时间:2016-05-02 18:31:53

标签: arrays ruby

我正在尝试创建一个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:我在第一次改变中编辑的拼写错误实际上是问题。我是个白痴。谢谢你的帮助。

1 个答案:

答案 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行的-不再存在。你确定写的代码仍然会引发声明的异常吗?