Question

Je suis en train de travailler sur une application Rails, et je suis à la recherche pour inclure certaines fonctionnalités de "Obtenir le nom d'hôte ou son adresse IP dans Ruby on Rails"qu'ai-je demandé.

Je vais avoir des problèmes pour la faire fonctionner.J'étais sous l'impression que je devrais juste faire un fichier dans le répertoire lib, donc j'ai appelé " get_ip.rb', avec le contenu:

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

J'avais aussi essayé de définir GetIP en tant que classe, mais quand je fais l'habitude ruby script/console, Je ne suis pas en mesure d'utiliser l' local_ip méthode à tous.Des idées?

Était-ce utile?

La solution

Vous n'avez pas décrit la manière dont vous essayez d'utiliser la méthode, donc je m'excuse à l'avance si ce sont des choses que vous savez déjà.

Les méthodes sur un module ne viennent jamais en utilisation, à moins que le module est inclus dans une classe.Les méthodes d'Instance d'une classe exige qu'il y ait une instance de la classe.Vous voudrez probablement une méthode de la classe à la place.Et le fichier lui-même devrait être chargé, généralement par l'intermédiaire de l'exiger de déclaration.

Si le code suivant dans le fichier 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

Ensuite, vous devriez être en mesure de l'exécuter en disant:

require 'getip'
GetIP.local_ip

Autres conseils

require charger un fichier.Si ce fichier contient toute la classe/module de définitions, puis votre code sera désormais en mesure de les utiliser.Si le fichier contient du code qui n'est pas dans tous les modules, il sera exécutée comme si elle était au même endroit que votre "besoin" d'appel (comme PHP include)

include est de le faire avec des modules.

Il prend toutes les méthodes dans le module, et les ajoute à votre classe.Comme ceci:

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.

Il y a aussi extend qui fonctionne comme ne comprennent, mais au lieu d'ajouter les méthodes exemple méthodes, ajoute comme classe des méthodes, comme ceci:

La remarque ci-dessus, comment, quand je voulais accéder à first_method, j'ai créé un nouvel objet de Orig classe.C'est ce que je veux dire par la méthode d'instance.

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

Notez que dans cet exemple, je ne suis pas en faire de nouveaux objets, tout en appelant la méthode directement sur la classe, comme si elle avait été définie comme self.first_method tout au long de.

Donc là vous allez :-)

require et include sont deux choses différentes.

require est strictement charger un fichier à la fois à partir d'un chemin de chargement.Le loadpath est une chaîne de caractères et c'est la clé utilisée pour déterminer si le fichier a déjà été chargé.

include est utilisé pour "mélanger-dans" modules dans d'autres classes. include est appelée sur un module et le module de méthodes sont inclus que les méthodes d'instance de la classe.

  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

Mais de nombreuses fois le module que vous voulez mélanger dans n'est pas dans le même fichier que la classe cible.Afin de vous faire un require 'module_file_name' et puis à l'intérieur de la classe, vous en faire une include module.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top