Вопрос

Я работаю над приложением Rails и хочу включить в него некоторые функции из "Получение имени хоста или IP в Ruby on Rails", что я спросил.

У меня проблемы с тем, чтобы заставить его работать.У меня сложилось впечатление, что мне следует просто создать файл в каталоге 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).

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 это две разные вещи.

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

Но во многих случаях модуль, который вы хотите добавить, находится не в том же файле, что и целевой класс.Итак, вы делаете require 'module_file_name' а затем внутри класса вы выполняете include module.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top