Ruby - من الممكن تمرير كتلة كمعلمة ككتلة فعلية لوظيفة أخرى؟
-
20-09-2019 - |
سؤال
هذا ما أحاول القيام به:
def call_block(in_class = "String", &block)
instance = eval("#{in_class}.new")
puts "instance class: #{instance.class}"
instance.instance_eval{ block.call }
end
# --- TEST EXAMPLE ---
# This outputs "class: String" every time
"sdlkfj".instance_eval { puts "class: #{self.class}" }
# This will only output "class: Object" every time
# I'm trying to get this to output "class: String" though
call_block("String") { puts "class: #{self.class}" }
على السطر الذي يقول فيه "extal.instance_eval {block.call}" ، أحاول إيجاد طريقة أخرى لجعل مثيل Run enterible eval الجديد على الكتلة. الطريقة الوحيدة التي يمكنني التفكير بها للحصول عليها للقيام بذلك هي تمرير extory_eval الكتلة الأصلية ، ليس كمتغير أو أي شيء ، ولكن ككتلة حقيقية كما في مثال الاختبار.
أي نصائح؟
المحلول
نعم. يمكنك تمرير الكتلة إلى الطريقة الأخرى عن طريق إعداد متغير الكتلة مع ampersand مثل SO:
def foo &blk
# now, blk is a variable bound to a block object
bar &blk
end
السبب الذي يجعلك تحصل على "فئة: كائن" هو أن روبي يستخدم النطاق المعجمي. هذا يعني أن الذات في puts "class: #{self.class}"
يعود الى main
, ، السياق الافتراضي.
لا تنتمي إلى StackOverflow