对于练习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行?
有人可以帮我解释一下我创建的那一行吗?我是从与这个问题无关的各种问题/答案创建的。我试着查看我做了什么,但我仍然有点失落,想要完全理解它。
答案 0 :(得分:4)
类似于使用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]))
我个人认为这一点同样易于理解,缺乏错误检查也是等价的。
您正在使用File#open
一个块以只写模式('w'
)打开to_file
。在块内,您可以访问打开的文件f
,当块终止时,文件将被关闭。 IO::read
读取from_file
的全部内容,然后将其传递到f
上的IO#write
(文件是IO的子类),将这些内容写入f
(这是to_file
的开放,只写文件。
答案 1 :(得分:1)
总有不同的做事方式:
将File.open
与块一起使用是一种很好的方法。我喜欢to_file
和from_file
在变量中声明。所以我认为这是一个好的,可读的解决方案,并不过分冗长。
这里的基本方法是使用更干净的File.open
方法和块来交换打开/关闭操作。带有块的File.open
将打开一个文件,运行块,然后关闭文件,这正是这里所需要的。由于该方法会自动打开和关闭文件,因此我们可以删除初始示例中显示的样板代码。 IO.read
是另一种快捷方法,它允许我们在没有所有打开/关闭样板的情况下打开/读取/关闭文件。这是一个练习,可以了解有关Ruby标准文件/ IO库的更多信息,在这种情况下,交换更详细的方法足以将事物简化为一行。
答案 2 :(得分:0)
我只是一个完全的初学者,但这对我有用:
open(ARGV[1], 'w').write(open(ARGV[0]).read)
对我来说它看起来并不优雅,但它确实有效。
编辑:如果不清楚,这是我尝试将整个脚本放到一行。