2013-06-19 59 views
1

做操17,通過尋找其他的回答,我是能夠凝結以下成一條線(如要求在加分#3)瞭解紅寶石堅硬方式EX17課外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. 有人可以幫助解釋我創建的行嗎?我從與這個問題無關的各種問題/答案中創建了這個問題。我嘗試過查找我所做的,但我仍然有點失落,並希望對此有充分的瞭解。

回答

1

總是有不同的做事方式:

使用File.open與塊是一個很好的方法在這裏。我喜歡在變量中聲明to_filefrom_file。所以我認爲這是一個不錯的可讀解決方案,並不過分冗長。

這裏的基本方法是用塊更換更清潔的File.open方法來打開/關閉操作。帶有塊的File.open將打開一個文件,運行該塊,然後關閉該文件,這正是此處需要的。由於該方法自動打開和關閉文件,因此我們可以刪除初始示例中出現的樣板代碼。 IO.read是另一種捷徑方法,它允許我們在沒有所有打開/關閉樣板的情況下打開/讀取/關閉文件。這是一個學習Ruby的標準File/IO庫的練習,在這種情況下,交換更詳細的方法足以將事物縮減到一行。

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的全部內容,然後通過f(文件是IO的子類)將其傳遞給IO#write,將這些內容寫入f(這是to_file的開放,只寫文件)。

0

我只是一個初學者,但是這對我的作品:

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

它看起來並不優雅的我,但它的工作原理。

編輯:這是我試圖把整個腳本放在一行,如果它不明確。

+1

這不是完整的答案。這是什麼意思?請更詳細地解釋爲關心問題。 – QMaster