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将加载一个文件。如果该文件包含任何类/模块定义,那么您的其他代码现在将能够使用它们。如果文件只包含不在任何模块中的代码,它将被运行,就好像它与您的“要求”调用在同一个地方一样(如 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

所以你去:-)

于 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是两个不同的东西。

require是从加载路径严格加载一次文件。加载路径是一个字符串,这是用于确定文件是否已加载的键。

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

但是很多时候你想要混入的模块和目标类不在同一个文件中。所以你做 arequire 'module_file_name'然后在课堂上你做一个include module.

于 2008-09-05T12:36:33.697 回答