2016-07-14 4 views
0

Я изучаю Ruby, следуя learnrubythehardway, и кажется очень простым и понятным, пока вас не попросят объяснить, что делают некоторые вещи. Я прокомментировал в своем коде, что, по моему мнению, происходит в программе. Хотел посмотреть, не попал ли я на цель, нужно переосмыслить ситуацию или не иметь понятия и не должен пытаться научиться кодовому кодированию.Понимание методов и объектов IO в Ruby

# Sets variables to arguments sent through terminal 
from_file, to_file = ARGV 

# Saves from_file object into in_file 
in_file = open(from_file) 
puts in_file 

# Saves from_file data into indata 
indata = in_file.read 
puts indata 

# Save to_file object into out_file with writing privileages 
out_file = open(to_file, 'w') 
puts out_file 

# Writes(copies) indata into out_file 
out_file.write(indata) 

# Closes files so they can not be accessed anymore 
out_file.close 
in_file.close 

Это то, что выход в терминале выглядит следующим образом:

#<File:0x0000000201b038> 
This is text from the ex17_from.txt file. 
Did it copy to the ex17_to.txt file? 
#<File:0x0000000201ae58> 

Мы также поставлена ​​задача, чтобы попытаться уменьшить количество кода, необходимого и говорят, что мы можем сделать все эти действия в одной строке кода. Я решил, что могу просто стереть все комментарии и поставить заявления, в то время как все остальное помещается в одну строку кода. Тем не менее, это будет одна длинная строка, и я не думаю, что это то, о чем просит автор. Любые идеи о том, как сократить этот код, будут полезны.

ответ

0

Вы можете использовать FileUtils#cp, и выполните следующие действия:

require "fileutils" 
FileUtils.cp *ARGV 

* знаков ARGV массива в двух параметров необходимо cp метода


В качестве альтернативы, ниже сжата версия коды:

# Sets variables to arguments sent through terminal 
from_file, to_file = ARGV 

# Saves from_file object into to_file 
open(to_file, 'w') do |out| 
    open(from_file) do |f| 
     f.each do |line| 
     out << line 
     end 
    end 
end 
+0

Отличное альтернативное решение. Я пытаюсь использовать блоки do, но я не уверен, разрешено ли это. Поэтому я просто заканчиваю это упражнение. Как вы решаете, когда использовать блоки do, а когда нет? Есть ли определенные моменты, когда мне всегда нужно использовать блок do? Или он делает все, что угодно, это всего лишь код? – limaBEAN

3

Я прокомментировал в своем коде, что, по моему мнению, происходит в программе. Хотел посмотреть, не попал ли я на цель, нужно переосмыслить вещи или не иметь понятия.

Вам нужно научиться видеть за письменными словами. Например, этот комментарий довольно бесполезен:

# Saves from_file object into in_file 
in_file = open(from_file) 

Не только бесполезно, но и фактически неверно. Что это за объект from_file? Каким будет объект in_file? Почему бы вам не упомянуть open?

Что на самом деле происходит здесь, так это то, что объект File/IO создается путем вызова open. И from_file, в данном случае, представляет собой путь к файлу. Не так много «объекта», не так ли? Но in_file - это полный объект File, который вы можете использовать для чтения содержимого файла.

То же самое касается остальной части ваших комментариев. Вы просто перепечатываете строку кода с человеческими словами, не описывая замысел за кодом.

+0

Спасибо за отзыв. Так научитесь описывать намерение, получите его. Комментарии всегда проходят через меня, но теперь я вижу, что это потому, что я отбрасываю себя. Знаете ли вы какие-либо хорошие ссылки, которые описывают всю компьютерную терминологию. Я читаю документацию ruby-doc.org, и это кажется прямым. Но понять это кажется немного сложнее для меня. Я предполагаю, что мне нужно больше узнать, что все значит и как оно работает. – limaBEAN

+0

@limaBEAN: да, именно вам просто нужно больше опыта и больше знакомых с stdlib (какой метод делает что и т. Д.). Когда вы сталкиваетесь с вызовом метода, которого вы не знаете, перейдите к его документации. Это то, что я делаю, и до сих пор он работал очень хорошо. :) –