新手问题 File 输入输出问题

veightz · 2015年07月05日 · 最后由 cicholgricenchos 回复于 2015年07月05日 · 1846 次阅读

我读取文件的时候遇到了一个问题

class MyFile < File
    def foo
        self.each_line do | line |
            puts line
        end
    end
end

file_path = "text_file"

file = MyFile.open(file_path) do | file |
    file.each_line do | line |
        puts line
    end
    file.close
end

输出结果为:

line 1
line 2
line 3

如果通过调用方法输出:

class MyFile < File
    def foo
        self.each_line do | line |
            puts line
        end
    end
end

file_path = "text_file"

my_file = MyFile.open(file_path) do | file |
    file.foo
    file.close
end

输入结果为:

/Users/veightz/Developer/RubyCode/io_error.rb:4:in `write': not opened for writing (IOError)
    from /Users/veightz/Developer/RubyCode/io_error.rb:4:in `puts'
    from /Users/veightz/Developer/RubyCode/io_error.rb:4:in `block in foo'
    from /Users/veightz/Developer/RubyCode/io_error.rb:3:in `each_line'
    from /Users/veightz/Developer/RubyCode/io_error.rb:3:in `foo'
    from /Users/veightz/Developer/RubyCode/io_error.rb:20:in `block in <main>'
    from /Users/veightz/Developer/RubyCode/io_error.rb:19:in `open'
    from /Users/veightz/Developer/RubyCode/io_error.rb:19:in `<main>'

我又添加了一个新方法 bar

class MyFile < File
    def foo
        self.each_line do | line |
            puts line
        end
    end

    def bar
        self.each_line do | line |
            p line
        end
    end
end

my_file = MyFile.open(file_path) do | file |
    file.bar
    file.close
end

输入结果为:

"line 1\n"
"line 2\n"
"line 3\n"

非常困惑,求解释。

目测是 putsp 表现不同, 指定 Kernel::puts line 好像就可以了

是不是因为 file 也有一个 puts 方法。。

去掉 close。 open 结束会自动 close 吧。

@although2013 应该是对的

在方法 foo 里,self 是 MyFile,你的代码等于是

def foo
    self.each_line do | line |
        self.puts line
    end
end

而File#puts的含义是向文件中写入内容,而错误出现在write方法,也说明了正在尝试向文件写入。

在 foo 外的过程,puts 是 Kernel.puts,含义是向控制台输出。

解决这个问题,可以在方法内显式调用

Kernel.puts line
$stdout.puts line

两种都可以

需要 登录 后方可回复, 如果你还没有账号请 注册新账号