سؤال

أنا أعمل على القضبان التطبيق وأتطلع أن تشمل بعض الوظائف من "الحصول على اسم المضيف أو الفكرية في روبي على القضبان"سألت.

أنا أعاني من مشاكل في الحصول على عمل.كنت تحت انطباع بأن يجب أن تجعل مجرد ملف في الدليل ليب لذا أطلق عليها اسم '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 طريقة على الإطلاق.أي أفكار ؟

هل كانت مفيدة؟

المحلول

لم وصف كيف كنت تحاول استخدام الأسلوب ، لذا أعتذر مقدما إذا كانت هذه هي الأشياء التي كنت تعرف مسبقا.

الطرق على الوحدة لا تأتي أبدا في استخدامها ما لم تكن الوحدة المدرجة في فئة.أساليب المثال على فئة تتطلب أن يكون هناك مثيل من فئة.ربما كنت تريد أسلوب فئة بدلا من ذلك.و يجب أن يكون الملف نفسه تحميل, عموما من خلال تتطلب البيان.

إذا التعليمة البرمجية التالية في ملف 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 سيتم تحميل ملف.إذا كان هذا الملف يحتوي على أي فئة/وحدة التعاريف الأخرى رمز الآن سوف تكون قادرة على استخدامها.إذا كان الملف يحتوي على التعليمات البرمجية التي ليست في أي وحدات, وسوف تحصل على تشغيل كما لو كان في نفس مكان 'مطلوب' دعوة (مثل 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 التي تعمل مثل تتضمن ، ولكن بدلا من إضافة الطرق كما سبيل المثال أساليب يضيف لهم الدرجة أساليب مثل هذا:

ملاحظة أعلاه ، كيف عندما أردت الوصول first_method ، أنا خلق كائن جديد من Orig فئة.هذا ما أعنيه سبيل المثال الأسلوب.

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

علما أنه في هذا المثال أنا لا يجعل أي كائنات جديدة فقط استدعاء الأسلوب مباشرة على الطبقة ، كما لو كان يعرف self.first_method كل جانب.

هناك حتى تذهب :-)

require و include هما شيئان مختلفان.

require هو بدقة تحميل الملف مرة من مسار الحمل.على loadpath هو سلسلة و هذا هو المفتاح المستخدمة لتحديد ما إذا كان الملف قد تم تحميلها بالفعل.

include يستخدم "mix-في" وحدات إلى فئات أخرى. 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