1

对于练习 17,通过搜索其他回复,我能够将以下内容浓缩为一行(如额外得分 #3 中所要求的)

from_file, to_file = ARGV
script = $0

input = File.open(from_file)
indata = input.read()

output = File.open(to_file, 'w')
output.write(indata)

output.close()
input.close()

我能够将其浓缩为:

from_file, to_file = ARGV
script = $0

File.open(to_file, 'w') {|f| f.write IO.read(from_file)}
  1. 有没有更好/不同的方法将其压缩为 1 行?

  2. 有人可以帮助解释我创建的线吗?我从与这个问题无关的各种问题/答案中创建了这个。我已经尝试过确切地查找我所做的事情,但我仍然有点迷茫,想要全面了解它。

4

3 回答 3

4
  1. 类似于使用IO::read简化“将整个文件读入字符串”,您可以使用IO::write“仅将字符串写入文件”:

    from_file, to_file = ARGV
    IO.write(to_file, IO.read(from_file))
    

    由于您不使用script,因此可以将其删除。如果你真的想把事情归结为一行,你可以这样做:

    IO.write(ARGV[1], IO.read(ARGV[0]))
    

    我个人认为这很容易理解,并且缺少错误检查是等效的。

  2. 您正在使用File#open块以to_file只写模式 ( 'w') 打开。在块内,您可以访问打开的文件f,当块终止时,文件将为您关闭。 IO::read读取 的全部内容from_file,然后将其传递给IO#writeon f(File 是 IO 的子类),将这些内容写入f(这是打开的、只写的 File to_file)。

于 2013-06-19T19:10:36.070 回答
1

总是有不同的做事方式:

在这里使用File.open块是一个很好的方法。我喜欢这样to_file并且from_file在变量中声明。所以我认为这是一个很好且可读的解决方案,并不过分冗长。

这里的基本方法是File.open使用带有块的更干净的方法交换打开/关闭操作。File.openwith a block 将打开一个文件,运行该块,然后关闭文件,这正是这里需要的。因为该方法会自动打开和关闭文件,所以我们可以删除初始示例中出现的样板代码。IO.read是另一种快捷方式,它允许我们在没有所有打开/关闭样板的情况下打开/读取/关闭文件。这是一个学习更多关于 Ruby 标准文件/IO 库的练习,在这种情况下,换掉更冗长的方法就足以将事情减少到一行。

于 2013-06-19T18:36:39.287 回答
0

我只是一个完整的初学者,但这对我有用:

open(ARGV[1], 'w').write(open(ARGV[0]).read)    

它对我来说看起来并不优雅,但它确实有效。

编辑:如果不清楚,这是我尝试将整个脚本放在一行中。

于 2014-12-25T20:47:33.303 回答