Ruby - من الممكن تمرير كتلة كمعلمة ككتلة فعلية لوظيفة أخرى؟

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

  •  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, ، السياق الافتراضي.

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