Ruby 理解一段计算文本行数的代码

runup · 2016年01月09日 · 最后由 runup 回复于 2016年01月10日 · 2419 次阅读

对 ruby 基础教程的书中代码进行了改写,其功能是计算文本的行数,但是我将变量 ltotal 放置在不同位置的时候显示不同的值,具体的代码如下所示:

ltotal = 0

ARGV.each do |file|
  begin
    input = File.open(file)
    l = 0
    input.each_line do |line|
      l += 1
      #ltotal += l  #最终执行结果为153
    end
    input.close
    ltotal += l   #最终执行结果为17
  rescue =>e
    puts "#{e.message}"
  end
end
puts ltotal

将上述代码存储为 wc.rb 文件,在终端执行 ruby wc.rb wc.rb,按照如上的代码,执行结果为 17,和实际情况相符。但是将代码 ltotal += 1 置于 input 这个块内部,那么这个结果将会变为 153,不知道问题出现在哪里,请帮忙指教。

ltotal += l  #最终执行结果为153

字符打错了,该是下面这个:

ltotal += 1  #最终执行结果为

#1 楼 @dc2000 没有,我是将 l 赋值给 ltotal 啊

#2 楼 @runup 我用的是 sublime text,字母和数字的颜色是不一样的。一般的文本编辑器都支持的吧。

#1 楼 @dc2000

ltotal += l  #就是将l赋值给ltotal

#1 楼 @dc2000 我的本意就是将 l 赋值给 ltotal

ltotal = 0

ARGV.each do |file|
  begin
    input = File.open(file)
    l = 0
    input.each_line do |line|
      l += 1
      ltotal += l  #最终执行结果为153
      puts "l的值为:#{l}"
      puts "ltotal的值为:#{ltotal}"
    end
    input.close
    ltotal += l   #最终执行结果为17
  rescue =>e
    puts "#{e.message}"
  end
end
puts ltotal

你用 puts 看看每次迭代之后的 ltotal 是什么就明白了。这应该是最基本的结构吧。

#6 楼 @dc2000 谢谢指点,帮忙找到解决之道。

lex 解决也不错

放在内部和外部逻辑上当然是不一样的。 就如数东西,自然是 1,2,3,4,5 , 而不是 1+2+3+4+5. 你这个 153, 就是 1+2+3...的结果吧. 我觉得就算是零时变量,也最好避免 l 和 o.

@runup 感觉你把问题弄复杂了,本来 ltotal 就是用于递增接收总行数的,你又引入一个变量 l ,他们干的事情没法不同。

#10 楼 @qinfanpeng 是的,自己实现的时候发现结果与预期不同,对比了书中的代码,才知道问题在哪里。后来认真总结了下,应该是自己理解闭包知识的理解不足。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号