2

LearnRubyTheHardWay のチュートリアルに従って、バージョン 1.9.3 で Ruby を学習しています。

内で関数を定義する場合、次のようにModule、関数名の前にモジュール名を付ける必要があるようです。

module MyStuff
    def MyStuff.apple()
        puts "I AM APPLES!"
    end
end

MyStuff.apple()

なぜこれができないのですか:

module MyStuff
    def apple()
        puts "I AM APPLES!"
    end
end

MyStuff.apple() # this does not work

Ruby ドキュメントには、上記のような例があります。

私は何を間違えていますか?

4

4 に答える 4

3

モジュールは、メソッド、クラス、および定数をグループ化する方法です。モジュールには 2 つの大きな利点があります。モジュールは名前空間を提供し、名前の競合を防ぎます。モジュールは mixin 機能を実装します。

から取得 ( http://www.tutorialspoint.com/ruby/ruby_modules.htm )

代わりに次のことができます。

module MyStuff
    def self.apple
        puts "I AM APPLES!"
    end
end

MyStuff.apple # "I AM APPLES!"
于 2013-03-02T15:07:15.193 に答える
2

これは、MyStuffでインスタンスメソッドappleとして定義しているためです。また、MyStuffはそれ自体のインスタンスではないため、呼び出すことはできません。apple

を呼び出すappleには、いくつかのオプションがあります。

  • MyStuffあなたが見つけたように、明示的にメソッドを定義します:

    module MyStuff
      def MyStuff.apple
        puts "I AM APPLES!"
      end
    end
    
    MyStuff.apple  #=> "I AM APPLES!"
    

    ただし、これを明示的にする必要はなく、次selfの代わりに使用できMyStuffます。

    module MyStuff
      def self.apple
        puts "I AM APPLES!"
      end
    end
    
    MyStuff.apple  #=> "I AM APPLES!"
    
  • includeMyStuffをクラスに入れて、そのクラスのインスタンスでメソッドを呼び出すことができます。

    module MyStuff
      def apple
        puts "I AM APPLES!"
      end
    end
    
    class Foo; include MyStuff; end
    
    Foo.new.apple  #=> "I AM APPLES!"
    
  • MyStuffをクラスまたはモジュールに組み込むことができextendます。これにはMyStuff自体が含まれます。

    module MyStuff
      extend self
    
      def apple
        puts "I AM APPLES!"
      end
    end
    
    MyStuff.apple  #=> "I AM APPLES!"
    
    module OtherStuff; extend MyStuff; end
    
    OtherStuff.apple  #=> "I AM APPLES!"
    

これは、クラスの動作と非常によく似ています。たとえば、これも機能しません。

class Foo
  def bar; 42; end
end

Foo.bar  #=> #<NoMethodError: undefined method `bar' for Foo:Class>

これもインスタンスメソッドであるため、インスタンスを作成するか、クラスメソッドbarを作成する必要があります。bar

class Foo
  def bar; 42; end
  def self.bar; 24; end
end

Foo.bar      #=> 24
Foo.new.bar  #=> 42
于 2013-03-02T15:12:27.030 に答える
2

最初のケースでは、クラスレベルのメソッドを作成しました。つまり、クラス/モジュールで直接呼び出すことができますMyStuff.apple。2 つ目では、インスタンス レベルのメソッドを作成しました。つまり、メソッドにアクセスするにはインスタンスが必要になります。

class MyKlazz
    include MyStuff
end

obj=MyKlazz.new
obj.apple
于 2013-03-02T15:07:12.217 に答える
0

最初の例...

module MyStuff
  def MyStuff.apple()
    puts "I AM APPLES!"
  end
end

...モジュール内ではなく、モジュール上でメソッドを定義しているため、機能します。これは、2番目の例で行っていることです。

module MyStuff
  def apple()
    puts "I AM APPLES!"
  end
end

これは、クラスがあり、同じことをした場合と似ています。

class Conrad
  def Conrad.apple()
    puts "I AM APPLES"
  end
end

を使用することもできますdef self.apple()。これは同じことを意味します。

class Conrad
  def self.apple()
    puts "I AM APPLES"
  end
end

どちらの場合も、クラスのインスタンスではなく、クラス自体にメソッドを定義しています。

モジュールの場合、そのクラスを拡張した場合(つまりConrad.apple)、そのクラスのインスタンスを代わりに含めた場合(つまり)、そのクラスで使用できるメソッドを定義しますConrad.new.apple

于 2013-03-02T15:10:04.277 に答える