学习Ruby the Hard Way ex17额外学分3 - 巩固到一行

时间:2013-06-19 18:24:10

标签: ruby learn-ruby-the-hard-way

对于练习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. 有人可以帮我解释一下我创建的那一行吗?我是从与这个问题无关的各种问题/答案创建的。我试着查看我做了什么,但我仍然有点失落,想要完全理解它。

3 个答案:

答案 0 :(得分: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一个块以只写模式('w')打开to_file。在块内,您可以访问打开的文件f,当块终止时,文件将被关闭。 IO::read读取from_file的全部内容,然后将其传递到f上的IO#write(文件是IO的子类),将这些内容写入f (这是to_file的开放,只写文件。

答案 1 :(得分:1)

总有不同的做事方式:

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

这里的基本方法是使用更干净的File.open方法和块来交换打开/关闭操作。带有块的File.open将打开一个文件,运行块,然后关闭文件,这正是这里所需要的。由于该方法会自动打开和关闭文件,因此我们可以删除初始示例中显示的样板代码。 IO.read是另一种快捷方法,它允许我们在没有所有打开/关闭样板的情况下打开/读取/关闭文件。这是一个练习,可以了解有关Ruby标准文件/ IO库的更多信息,在这种情况下,交换更详细的方法足以将事物简化为一行。

答案 2 :(得分:0)

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

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

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

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