Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby:正在调用。IO.readlines输出上的每个都在循环_Ruby - Fatal编程技术网

Ruby:正在调用。IO.readlines输出上的每个都在循环

Ruby:正在调用。IO.readlines输出上的每个都在循环,ruby,Ruby,我使用@file=IO.readlines(文件名)打开一个文件。然后不久,我用以下方法遍历所有行: def symbolicate @file.each do |line| puts line type = get_type(line) add_label(line) if type == :label end end 我最终在get\u type()中得到了一个nil,这导致了问题。在调试过程中,我记录了each块中的每一行,发现在读取完所有行之后,第一行在

我使用
@file=IO.readlines(文件名)
打开一个文件。然后不久,我用以下方法遍历所有行:

def symbolicate
  @file.each do |line|
    puts line
    type = get_type(line)
    add_label(line) if type == :label
  end
end
我最终在
get\u type()
中得到了一个nil,这导致了问题。在调试过程中,我记录了each块中的每一行,发现在读取完所有行之后,第一行在循环结束时再次出现。我使用
each_with_index
——得到最后一次迭代,其中索引再次为0,
line
的值是文件的第一行

我肯定我在这里做错了什么,但我不应该这样循环似乎很简单。同样令人困惑的是,我在
get_type
方法中得到了一个nil,因为在我进入该方法之前打印
line
的值是有效的。有没有关于如何解决这个问题的想法

编辑:为了调试,我尝试了以下方法:

def symbolicate
  count = 0
  @file.each do |line|
    puts count.to_s + ": " + line
    count += 1
    #same stuff as before here
  end
end
当我到达循环末尾时,
count
再次变为零,即使它是在.each循环之外初始化的,并且只会递增。这怎么可能?!下面是上面第二个代码段的输出(打印count变量和行):


正如您所看到的,当循环跳回到开始时,即使是
count
变量也会被重置

解决了这个问题。nil错误与重新循环无关-我意外地调用了symbolicate()两次(因此循环)。零是因为我打电话给chomp!()如果不做任何更改,则返回nil(而不是像我预期的那样返回所选字符串的值。

你在哪里调用symbolicate?可能还有一个问题。
initialize
只是将文件读入
@file
并设置一些常量和空实例变量。然后类的真正入口点是调用
symbol的
parse
首先执行。因此,基本上没有任何上游问题。通过调试(例如,输出count字段,或将某件事情作为第一件事进行验证(介于
def symbolicate
count
)?只需将调试输出添加到OP,我想这就是您要问的。。。
0: @SCREEN
1: D=A
2: @current
3: M=D
4: @KBD
5: D=M
6: @KEYDOWN
7: D;JGT
8: (KEYUP)
9: @0
10: D=A
11: @current
12: A=M
13: M=D
14: @current
15: M=M+1
16: @KBD
17: D=M
18: @KEYUP
19: D;JEQ
20: (CHANGE)
21: @SCREEN
22: D=A
23: @current
24: M=D
25: @KBD
26: D=M
27: @KEYUP
28: D;JEQ
29: (KEYDOWN)
30: @0
31: D=!A
32: @current
33: A=M
34: M=D
35: @current
36: M=M+1
37: @KBD
38: D=M
39: @KEYDOWN
40: D;JGT
41: @CHANGE
42: 0;JMP
0: @SCREEN