Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/13.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算法_Ruby_Algorithm_Refactoring - Fatal编程技术网

如何重构这个简单的Ruby算法

如何重构这个简单的Ruby算法,ruby,algorithm,refactoring,Ruby,Algorithm,Refactoring,好的,我有一个ruby脚本,它打开一个文件并将每一行传递给line\u解析器方法。此方法只需更改几个空格的选项卡。这是: $lines = [] def line_parser(line) line.gsub! /\t/, ' ' $lines[$lines.length] = line end f = File.open(ARGV[0], 'r').each { |line| line_parser(line) } f.close f = File.open(AR

好的,我有一个ruby脚本,它打开一个文件并将每一行传递给line\u解析器方法。此方法只需更改几个空格的选项卡。这是:

$lines = []

def line_parser(line)   
    line.gsub! /\t/, '  '
    $lines[$lines.length] = line
end

f = File.open(ARGV[0], 'r').each { |line| line_parser(line) }
f.close

f = File.open(ARGV[0], 'w')
$lines.each { |line| f.puts line}
f.close
正如你所看到的,它有两个循环one loop迭代文件中的文本行,并将它们放入数组中。另一个循环使用最近创建的数组中的新行重新写入文件

我的问题很简单,我想: 如何重构此代码段,以便只在一个循环中执行上述所有步骤?

我知道这是可以做到的,我只是用我目前的ruby知识还不能做到

提前谢谢

#/usr/local/bin/ruby-w
#!/usr/local/bin/ruby -w

src = File.read(ARGV[0])

File.open(ARGV[0], 'w') { | io |
  src.each_line { | line |
    io << line.gsub(/\t/, '  ')
  }
}
src=File.read(ARGV[0]) open(ARGV[0],'w'){io| src.each_行{124;行| io
!/usr/local/bin/ruby-w
src=File.read(ARGV[0])
open(ARGV[0],'w'){io|
src.each_行{124;行|
io
out=“”
File.open(ARGV[0],“r+”)do | f|
f、 每行|
out
out=“”
File.open(ARGV[0],“r+”)do | f|
f、 每行|
我们能用rubygems吗

require 'rubygems'
require 'facets/file'

# Version 1
File.write('outfile', File.read('infile').tr("\t", ' '))

# Version 2
File.rewrite('inoutfile') { |str| str.tr("\t", ' ') }
我们能用rubygems吗

require 'rubygems'
require 'facets/file'

# Version 1
File.write('outfile', File.read('infile').tr("\t", ' '))

# Version 2
File.rewrite('inoutfile') { |str| str.tr("\t", ' ') }

这个问题给出了另一种选择:,即编写一个临时文件,然后覆盖输入文件,而不是再次循环行。尽管如果您只是想找到一种简单的方法来实现这一点(而不仅仅是更好的ruby方法),我相信sed-i's/\t//g'yourfile
会起到作用。这种问题最好是在这个问题上给出一个替代方法:,即编写一个临时文件,然后覆盖输入文件,而不是再次循环行。尽管如果您只是想找一种简单的方法来做这件事(不仅仅是更好的ruby方法),我相信sed-i's/\t//g'yourfile
可以解决这个问题。这种问题最好是我可以用我猜的任何东西。这似乎是一个有趣的解决方案。当我这样做的时候,我实际要用什么包:需要“rubygems”?请原谅我的无知。Thanks@user-Rubygems是事实上的包管理系统stem for ruby。当您需要rubygems时,您只需加载或激活软件包管理系统。完成后,可以使用
require
激活各个软件包,就像我在这里使用
facets
软件包一样。要了解更多信息并搜索或浏览可用软件包,请访问此处:这对我非常有用。Nicely解释说,非常感谢!我现在真的需要这些对语言的小洞察。我可以使用我猜的任何东西。这似乎是一个有趣的解决方案。当我这样做时,我实际要将哪些包拉到文件中:需要“rubygems”?请原谅我的无知。Thanks@user-Rubygems实际上是ruby的包管理系统require rubygems您只需加载或激活软件包管理系统。完成后,就可以使用
require
激活单个软件包,就像我在这里使用
facets
软件包一样。要了解更多信息并搜索或浏览可用软件包,请访问此处:这对我非常有用。解释得很好,谢谢非常感谢!我现在真的需要这些对语言的小洞察。你的代码运行得非常好,比我的代码好一百万倍。:)然而,我只是想知道..这能在没有临时文件、字符串或数组的情况下完成吗?(只是想知道..)您的代码运行得非常好,比我的代码好一百万倍。:)然而,我只是想知道..这能在没有临时文件、字符串或数组的情况下完成吗?(只是想知道..)看起来不错,非常地道。你能解释一下File.open块的io参数吗?非常感谢你的回答!@user766388:这是用Ruby方式表示
io=File.open(…);io看起来不错,非常地道。您能解释一下File.open块的io参数吗?非常感谢您的回答!@user766388:这是Ruby表示
io=File.open(…);io的方式