未定义的方法和实例变量

时间:2014-05-29 16:57:32

标签: ruby methods instance-variables

我正在尝试构建一个非常简单的计算机模块,允许您创建文件,查看和编辑它们。我遇到了未定义的方法和实例变量的确切性质的问题。我稍后会谈到这些。你可以去博士,然后去粗体区域。

class Computer
@@users = Hash.new
def initialize(username, password)
    @username = username
    @password = password
    @files = Hash.new
    @files["Groceries.txt"] = "10:20"
    @files["Blane.txt"] = "10:30"
    @@users[username] = password
end
def create(filename)
    time = Time.now
    @files[filename] = time
    puts "A new file, #{filename}, was created at #{time}"
end
def Computer.get_users
    return @@users
end
end

所以我只是在这里定义我的类变量“Computer”。

puts "You need to login!"
puts "Username?"
userName = gets.chomp.downcase
puts "Password?"
passWord = gets.chomp
my_computer = Computer.new(userName, passWord)
puts "You logged in with Username: #{userName}"
puts "and Password: #{passWord}" 
puts "What would you like to do?"
puts "-- Create a file (type create)"
puts "-- Change a file (type change)"
puts "-- View a file (type view)"
puts "-- Delete a file (type delete)"
answer = gets.chomp.downcase
case answer
when "create" 
    puts "What is the name of the file?"
    @create = gets.chomp.capitalize
    if @files[@create].nil?
    my_computer.create(@create)
    else
        puts "That file already exists!"
    end
when "change"
    puts "What is the name of the file you want to change?"
    @files.each do |x, y|
        puts "#{x}: #{y}"
    end
    @change = gets.chomp.capitalize
end

现在我收到错误“未定义的方法`[]'为nil:NilClass”指的是

if @files[@create].nil?

只是检查新文件是否已经在其中。我不知道这是一个问题,我在哪里定义变量,或者它是实例变量,还是问题所在。此外,如果我添加行:

my_computer.initialize(userName, passWord)

我收到以下错误: 私有方法`initialize'调用#

我的最后一个问题是,当我尝试使用以下代码打印出已存在的文件名时

@files.each do |x, y|
        puts "#{x}: #{y}"
    end

我收到以下错误: 未定义的方法`每个'为nil:NilClass

我认为.each方法是通用的,但现在看来我必须在课堂上定义它?

对不起文字的墙,但我对ruby很新,这是我的第一个编程语言,所以我想弄清楚语言的细微差别。提前谢谢!

1 个答案:

答案 0 :(得分:0)

if @files[@create].nil?

@files.each do |x, y|
    puts "#{x}: #{y}"
end

此代码位于Computer类定义之外。由于@files是一个类实例变量(它在Class Computer... end块中定义),因此它只能在类本身中访问。它无法访问它。

my_computer.initialize(userName, passWord)

您无法直接调用initialize方法。或者,当您调用new方法时,会自动调用此方法。所以你的代码:

my_computer = Computer.new(userName, passWord)

自动拨打initialize上的my_computer