كيفية تحديد طريقة فئة ديناميكية والتي ستشير إلى متغير محلي في الخارج؟
-
28-09-2019 - |
سؤال
class C
end
var = "I am a local var outside"
C.class_eval do
def self.a_class_method
puts var
end
end
أعلم ، هذا غير صحيح ، لأن def
خلقت نطاق جديد. أنا أعلم أيضًا هذا الاستخدام define_method
يمكن إنشاء طريقة مثيل دون إنشاء نطاق جديد ، لكن نقطتي هي كيفية تحديد أ طريقة الفصل.
المحلول
أساليب الفصل ليست موجودة حقًا في روبي ، فهي مجرد أساليب مفردة لكائن الفصل. أساليب Singleton غير موجودة حقًا ، فهي مجرد أساليب مثيل عادية لفئة Singleton للكائن.
نظرًا لأنك تعرف بالفعل كيفية تحديد طرق المثيل (باستخدام Module#define_method
) ، أنت تعرف بالفعل كل ما تحتاج إلى معرفته. تحتاج فقط للاتصال class_eval
على C
فئة Singleton بدلاً من C
بحد ذاتها:
(class << C; self end).class_eval do
define_method(:a_class_method) do
puts var
end
end
الإصدارات الحالية من Ruby لها أ singleton_class
طريقة لتسهيل ذلك:
C.singleton_class.class_eval do
define_method(:a_class_method) do
puts var
end
end
ولكن في الواقع ، فإن الإصدارات الحالية من روبي لديها أيضا Module#define_singleton_method
, ، لذلك ، في هذه الحالة بالذات ، هذا غير ضروري:
C.define_singleton_method(:a_class_method) do
puts var
end
نصائح أخرى
يمكنك أن تفعل ذلك ببساطة بهذه الطريقة
class << C
define_method(:a_class_method) do
# do something
end
end
C.instance_eval do
def class_method
"This is class method"
end
end
easule_eval: يحدد أساليب Singleton على الكائن (والذي ينتج عنه أساليب الفصل عندما يتم استدعاؤه على كائن الفئة).
class_eval: يحدد طرق المثيل العادية