1

为什么我已经在使用 include 方法时需要 require "stacklike"in ?如果我删除,它会产生错误。stack.rbstacklike.rbrequire"Uninitialized constant Stack::Stacklike (NameError)"

stacklike.rb

module Stacklike
  def stack
    @stack ||= []  #@stack || @stack = []
  end
  def add_to_stack(obj)
    stack.push(obj)
  end
  def take_from_stack
    stack.pop
  end
end

堆栈.rb

require_relative "stacklike"
class Stack
  include Stacklike
end

s = Stack.new
s.add_to_stack("people")
s.add_to_stack("people2")
s.add_to_stack("people3")

puts "obj currently on the stack:"
puts s.stack

taken = s.take_from_stack
puts "Removed this stack:"
puts taken

puts "Now on stack:"
puts s.stack
4

3 回答 3

1

Rubyinclude不访问文件系统。给定的模块必须已经定义,否则NameError将引发 a:

# foo.rb
class Foo
  include Bar  # NameError: uninitialized constant Foo::Bar
end

这有效(一个文件中的所有内容):

# foo.rb
module Bar
end

class Foo
  include Bar
end

如果您的模块是在单独的文件中定义的,则必须使用requireor加载此文件require_relative

# bar.rb
module Bar
end

# foo.rb
require_relative 'bar'
class Foo
  include Bar
end
于 2013-10-28T14:29:31.170 回答
0

我们使用Module#include带有模块名称的方法作为该方法的参数,以将这些模块添加到需要类的祖先链中。现在Kernel#require_relative将提供从需要文件到顶层所需文件的类、模块等。

当您这样做时require_relative "stacklike",这意味着您在文件stacklike.rb中定义的模块、类等现在可用于文件的顶层stack.rb。现在要使用模块的实例方法Stacklike,使用类的实例Stack,您需要将该模块包含到类Stack中。

于 2013-10-28T13:55:06.080 回答
0

require是关于文件的。include是关于模块的。由于在 Ruby 中模块和文件不是一一对应的,因此需要文件和包含模块是不同的任务。它们需要单独控制。

模块的内容Stacklike写在文件上stacklike.rb,所以你需要要求那个文件才能访问模块。Stack然后,如果您愿意,您需要包括在内。

于 2013-10-28T15:12:05.377 回答