我看到了旧时的C语言疤痕

导语 一个月前,我正在写一个简单的应用,是用 ruby 去读 pdf 文件,不知道为什么,文件指针跑到了文件开始地址的前面。我不明白为什么会这样。于是,像往常一样,我到 stackover ... ... ...
博学谷

    一个月前,我正在写一个简单的应用,是用 ruby 去读 pdf 文件,不知道为什么,文件指针跑到了文件开始地址的前面。我不明白为什么会这样。于是,像往常一样,我到 stackoverflow 上发帖求助。得到的第一条回复是:

“你的代码有C语言的味道….”

  有什么??进一步的阅读,我发现在 ruby 里有一个很方便的 IO 操作包,根本不需要使用 getc (这是我的习惯用法)——除非在一些特殊情况下。

  我想说的是,用一种新语言编程,在学会这种语言的正确语法前,你需要了解它的基本原理。当你说“我会 XXX 语言”时,你的意思并不是指知道它的语法。而是知道这种语言里有更好的算法实现方法和问题解决方案,否则,你学习这种新语言的意义在哪里呢?!

  让我们来分析一个问题,假设我们需要找到一个文件的最后一行的开始处(这是我以前做过的一个任务)。

  像我这样懂得一点C语言的人会这样写:

fseek (fp,-1,SEEK_END);
  do {    fseek (fp,-2,SEEK_CUR);
  }while(fgetc (fp)!='\n');

  用 ruby 也能写出类似的代码,让你一个新学习 ruby 的C程序员来写,他就会写出这样:

i) file.seek (-1,IO::SEEK_END)
    while file.getc != "\n"
         file.seek (-2,IO::SEEK_CUR)
    end    

  但是,一个熟练的 ruby 程序员则会写成这样:

ii) buff = file.readlines
  file.seek (-(buff.pop) .length,IO::SEEK_END)
  或
iii) lastline = Elif.open ("file.txt") { |f| f.gets }
  file.seek (-lastline.length, IO::SEEK_END)

  对我来说,iii)是最好的实现方法,它能处理大型文件,不管日后它增长到多大。这个 Elif 工具包把文件切割成了很小的片段,把它们放到小的缓冲池里,分析完后从缓冲里清除掉。你可以看一下它的 gem 。如果你研究源文件,你会发现,任何一个需要使用到的字符串对象方法都使用的非常聪明。

  这只是一个简单的例子,来说明改变思维习惯是如何能巨大的提高你的代码效率。我知道,作为一个新语言学习者,学会用新的语言风格和思维习惯编程是很困难的。我记得当老师在课堂上教我们汇编语言时,很多人会先把作业用C语言写成,然后再写出汇编代码,因为他们更熟悉C语言。但是,如果你有了一定经验,而你的程序中仍然有一些老的语言的痕迹,这说明你遇到了麻烦。

  所以,如果我学习一种新语言,过程会是:

  基本原理 –> 语法 –> Library/APIs

       英文原文:

https://www.nucmc.com/ true 我看到了旧时的C语言疤痕 https://www.nucmc.com/show-15-14-1.html report 5528.5 一个月前,我正在写一个简单的应用,是用 ruby 去读 pdf 文件,不知道为什么,文件指针跑到了文件开始地址的前面。我不明白为什么会这样。于是,像往常一样,我到 stackover ... ... ...
TAG:C语言
本站欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果
转载请注明: 文章转载自:BETWAY官网网 https://www.nucmc.com/show-15-14-1.html
BETWAY官网网 Copyright 2012-2014 www.nucmc.com All rights reserved.(晋ICP备13001436号-1)