【问题标题】:Understanding IO methods and objects in Ruby理解 Ruby 中的 IO 方法和对象
【发布时间】:2016-07-14 15:41:26
【问题描述】:

我正在通过关注learnrubythehardway 学习 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>

我们还被赋予了尝试减少所需代码量的任务,并被告知我们可以在一行代码中完成整个操作。我想我可以删除所有的 cmets 和 puts 语句,而将其他所有内容放入一行代码中。但是,这将是一条长线,我认为这不是作者所要求的。有关如何缩短此代码的任何想法都会有所帮助。

【问题讨论】:

    标签: ruby methods io


    【解决方案1】:

    我已经在我的代码中注释了我认为程序中正在发生的事情。想看看我是否达到目标,需要重新考虑事情还是不知道

    你需要学会超越文字。例如,这条评论就没什么用了:

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

    不仅没用,而且实际上是不正确的。这是什么from_file 对象? in_file 会是一个什么样的对象?为什么不以任何方式提及open

    这里实际发生的是通过调用open 创建一个文件/IO 对象。在这种情况下,from_file文件路径。没有太多的“对象”,是吗?但是in_file 是一个完整的 File 对象,您可以使用它来读取文件的内容。

    其余的 cmets 也是如此。您只需用人类语言重新编写代码行,而无需描述代码背后的意图

    【讨论】:

    • 感谢您的反馈。所以学习如何描述意图,明白了。评论总是通过我关闭,但现在我可以看到这是因为我把自己扔掉了。您知道描述所有计算机术语的任何好的参考资料吗?我通读了 ruby​​-doc.org 文档,看起来很简单。但是理解它对我来说似乎有点困难。我的猜测是我需要更加熟悉一切的含义以及它是如何工作的。
    • @limaBEAN: 是的,确切地说,你只需要更多的经验和对 stdlib 的熟悉(哪个方法做什么等)当你遇到一个你不知道的方法调用时,去阅读它文档。这就是我所做的,到目前为止效果很好。 :)
    【解决方案2】:

    您可以使用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
    

    【讨论】:

    • 很好的替代解决方案。我一直在尝试使用 do 块,但我不确定它是否被允许。所以我最终还是按照教程完成了。你如何决定何时使用 do 块,何时不使用?是否有某些时候我总是需要使用 do 块?还是随心所欲,只是代码?
    猜你喜欢
    • 1970-01-01
    • 2013-10-25
    • 2011-05-16
    • 2015-10-06
    • 1970-01-01
    • 2012-06-26
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多