質問

私は 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 まったく方法。何か案は?

役に立ちましたか?

解決

このメソッドをどのように使用しようとしているのかについては説明されていないため、すでにご存知の内容であった場合は、あらかじめお詫び申し上げます。

モジュールのメソッドは、モジュールがクラスに組み込まれない限り使用されません。クラスのインスタンス メソッドには、クラスのインスタンスが必要です。おそらく代わりにクラスメソッドが必要になるでしょう。そして、ファイル自体は通常、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

他のヒント

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.

それもあります extend これは include と同じように機能しますが、メソッドを追加する代わりに 実例 メソッドを次のように追加します クラス 次のようなメソッド:

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

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

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

それではどうぞ:-)

require そして include は 2 つの異なるものです。

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

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

しかし、多くの場合、混合したいモジュールはターゲット クラスと同じファイル内にありません。それで、あなたは次のことを行います require 'module_file_name' そしてクラス内で次のことを行います include module.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top