2

私はRailsアプリに取り組んでおり、私が尋ねた「Ruby on Railsでホスト名またはIPを取得する」からいくつかの機能を含めようとしています。

私はそれを機能させるのに問題があります。libディレクトリにファイルを作成するだけでよいという印象を受けていたので、内容を「get_ip.rb」と名付けました。

require 'socket'

module GetIP
  def local_ip
    orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true  # turn off reverse DNS resolution temporarily

    UDPSocket.open do |s|
      s.connect '64.233.187.99', 1
      s.addr.last
    end
  ensure
    Socket.do_not_reverse_lookup = orig
  end
end

また、GetIP をクラスとして定義しようとしましたが、通常の方法を実行すると、メソッドをまったくruby script/console使用できません。local_ip何か案は?

4

3 に答える 3

5

requireファイルをロードします。そのファイルにクラス/モジュール定義が含まれている場合、他のコードでそれらを使用できるようになります。ファイルにどのモジュールにも含まれていないコードが含まれている場合、「require」呼び出しと同じ場所にあるかのように実行されます (PHP インクルードなど)。

includeモジュールと関係があります。

モジュール内のすべてのメソッドを取得し、それらをクラスに追加します。このような:

class Orig
end

Orig.new.first_method # no such method

module MyModule
  def first_method
  end
end

class Orig
   include MyModule
end
Orig.new.first_method # will now run first_method as it's been added.

extendinclude のように機能するものもありますが、メソッドをインスタンスメソッドとして追加する代わりに、次のようにクラスメソッドとして追加します。

上記のように、first_method にアクセスしたいときに、Origクラスの新しいオブジェクトを作成した方法に注意してください。それがインスタンスメソッドの意味です。

class SecondClass
  extend MyModule
end
SecondClass.first_method # will call first_method

この例では、新しいオブジェクトを作成していないことに注意してください。最初から定義されているかのように、クラスでメソッドを直接呼び出しているだけself.first_methodです。

それでは、どうぞ:-)

于 2008-09-05T05:55:18.467 に答える
4

メソッドをどのように使用しようとしているのかを説明していないため、これが既に知っているものである場合は、事前にお詫び申し上げます。

モジュールがクラスに含まれていない限り、モジュールのメソッドが使用されることはありません。クラスのインスタンス メソッドには、クラスのインスタンスが必要です。代わりにクラスメソッドが必要になるでしょう。また、通常は require ステートメントを使用して、ファイル自体をロードする必要があります。

次のコードがファイル getip.rb にある場合、

require 'socket'

class GetIP
  def self.local_ip
    orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true

    UDPSocket.open do |s|
      s.connect '64.233.187.99', 1
      s.addr.last
    end
  ensure
    Socket.do_not_reverse_lookup = orig
  end
end

次に、次のように言って実行できるはずです。

require 'getip'
GetIP.local_ip
于 2008-09-05T05:19:10.490 に答える
0

requireincludeは 2 つの異なるものです。

requireロードパスからファイルを1回厳密にロードすることです。loadpath は文字列で、これはファイルが既にロードされているかどうかを判断するために使用されるキーです。

includeモジュールを他のクラスに「ミックスイン」するために使用されます。includeモジュールで呼び出され、モジュール メソッドはクラスのインスタンス メソッドとして含まれます。

  module MixInMethods
    def mixed_in_method
      "I'm a part of #{self.class}"
    end
  end

  class SampleClass
    include MixInMethods
  end

  mixin_class = SampleClass.new
  puts my_class.mixed_in_method # >> I'm a part of SampleClass

しかし、多くの場合、ミックスしたいモジュールはターゲット クラスと同じファイルにありません。したがって、 a を実行してrequire 'module_file_name'から、クラス内で を実行しますinclude module

于 2008-09-05T12:36:33.697 に答える