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

stack.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はファイル システムにアクセスしません。指定されたモジュールはすでに定義されている必要があります。そうでない場合、 aNameErrorが発生します。

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

これは機能します(1つのファイル内のすべて):

# foo.rb
module Bar
end

class Foo
  include Bar
end

requireモジュールが別のファイルで定義されている場合は、またはを使用してこのファイルをロードする必要がありますrequire_relative

# bar.rb
module Bar
end

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

requireファイルについてです。includeモジュールについてです。Ruby ではモジュールとファイルが 1 対 1 で対応していないため、ファイルを要求することとモジュールを含めることは別のタスクです。それらは個別に制御する必要があります。

モジュールの内容はStacklikeファイルに書かれているstacklike.rbので、モジュールにアクセスするにはそのファイルを要求する必要があります。次に、必要に応じて含める必要がありますStack

于 2013-10-28T15:12:05.377 に答える
0

Module#includeモジュール名を持つメソッドをそのメソッドのパラメーターとして使用して、それらのモジュールを必要なクラスの祖先チェーンに追加します。Kernel#require_relative必要なファイルから最上位の必要なファイルまで、クラス、モジュールなどを利用できるようになりました。

実行するとrequire_relative "stacklike"、ファイル内で定義したモジュール、クラスなどがファイルstacklike.rbのトップレベルで利用できるようになりましたstack.rb。モジュールのインスタンス メソッドを使用するにStacklikeは、クラスのインスタンスを使用してStack、そのモジュールをクラスに含める必要がありますStack

于 2013-10-28T13:55:06.080 に答える