كيفية تحديد طريقة فئة ديناميكية والتي ستشير إلى متغير محلي في الخارج؟

StackOverflow https://stackoverflow.com/questions/3487403

سؤال

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: يحدد طرق المثيل العادية

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top