无法加载此类文件 - write_file

时间:2015-09-05 19:04:11

标签: ruby

我是Ruby的新手。我刚开始这样对我很陌生,因为我来自Java& C#背景。

write_file.rb包含:

class Write_file

  def write_method(title, text)

    @title = title+".txt"
    my_file = File.new(@title, 'w')
    #my_file.close
    puts "Creating file..."

    @text = text
    my_file = File.open(@title, 'w'){|file|
      file.puts @text
    }
    puts "done!"
  end
end

read_file.rb包含:

class Read_file
  def read_method(title)
    file = title + ".txt"
    File.readlines(file).each do |line|
      puts line
    end
  end
end

write_read.rb包含:

require "write_file"
require "read_file"
puts "Choose what you want to do :\n1. Write a file\n2. Read a file"
input = gets.to_i
if input.equals? 1
  puts "Enter name of file here:"
  title = gets.chomp
  puts "Enter text here:"
  text =gets.chomp
  x = Write_file.new
  x.write_method(title,text)
  puts x
elsif input.equals? 2
  puts "Enter name of file to read"
  file = gets.chomp
  rid = Read_file.new
  rid.read_method(file)
  puts rid
else puts "Invalid selection"
end

但是我收到以下错误:

/usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- write_file (LoadError)                                            
    from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'                                                                                
    from /home/ubuntu/workspace/ruby/write_read.rb:1:in `<main>'                                 

2 个答案:

答案 0 :(得分:1)

当您从命令行运行脚本时,通常会使用如下命令:ruby my_script.rb。当你这样做时,你在ruby可执行文件的上下文中运行该脚本,并且ruby可执行文件需要访问任何路径。宝石等在可执行文件中注册,因此可以合理地轻松访问它们的路径。但是您编写的其他脚本将不会为ruby可执行文件所知,因此无法通过简单的require <filename>访问。

因此,为了解决这个问题,你可以做一些事情。一个是这样做:

require File.expand_path('write_file', File.dirname(__FILE__))

告诉ruby文件的位置与正在运行的脚本文件有关。

然而,由于ruby 1.9.3有一个更简单的解决方案;使用require_relative。这相当于上面的expand_path代码:

require_relative 'write_file'

答案 1 :(得分:1)

有些事情你做得不对。

您的错误是由于不了解Ruby如何加载要包含在脚本中的文件。

默认情况下,

require将从Ruby的核心库和标准库以及您安装的任何gem中加载文件。它也可以使用绝对路径和相对路径。有时人们会将本地目录推送到搜索路径,以使require能够找到本地文件,但这不是必需的或特别推荐的;为什么涉及脚本安全性并导致创建require_relative

的原因 默认情况下,如果您指定了文件的相对路径,

require_relative将从当前目录或其他目录加载文件。在您的代码中,您应该使用require_relative加载write_file

继续前进:

  • Write_fileRead_file不是课程的好名字。我们将CamelCase用于类名,因此WriteFileReadFile更合适,但类是事物,而不是操作,因此File是合适的(如果它尚未被内置的File类)和类内部将是writeread方法(内置的File类中已经存在)。
  • 您对@title等实例变量的使用不正确。将实例变量视为一个全局变量,该变量只能在其实例中由类的实例访问。您只在给定方法中使用@title,而不是在其外部,因此局部变量title是合适的。变量范围,它们在块,类,方法等中的可见性,一开始是令人困惑的,所以花时间预先对它们进行良好的处理,否则你将全部喷出变量并遇到问题,它们被踩到了。 / LI>