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