سؤال

class Foo
  def with_yield
    yield(self)
  end

  def with_instance_eval(&block)
    instance_eval(&block)
  end
end

f = Foo.new

f.with_yield do |arg|
  p self
  # => main
  p arg
  # => #<Foo:0x100124b10>
end

f.with_instance_eval do |arg|
  p self
  # => #<Foo:0x100124b10>
  p arg
  # => #<Foo:0x100124b10>
end

لماذا الثانية "p arg" تقرير المثال فو؟ لا ينبغي أن يقدم تقريرا nil منذ with_instance_eval لا تسفر self إلى كتلة؟

هل كانت مفيدة؟

المحلول

وعلى ما يبدو في روبي 1.8 instance_eval لا فقط تغيير قيمة الذات داخل كتلة المستقبل، فإنه ينتج أيضا تلك القيمة. في 1.9 هذا لم يعد هو الحال (وسيطة يكون لا شيء هناك)، لذلك لا يجب الاعتماد على ذلك السلوك (أنا أيضا متأكد من انها لا يحملون وثائق).

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