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