質問
私は 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
.