İki kod parçanız çok farklı şeyler yapar. Instance_eval kullanarak, nesneyi bağlamında bloğu değerlendiriyorsunuz. Bu, def kullanılarak bu nesne üzerindeki yöntemleri tanımlayacağı anlamına gelir. Ayrıca, bloğun içinde bir alıcı olmayan bir yöntem çağırmak, onu nesnenizde çağıracaktır.
Kendinizi yitirirken, kendini bloğa bir argüman olarak geçiriyorsunuz, ancak bloğunuz herhangi bir argüman almıyor olduğundan basitçe yok sayılır. Yani bu durumda benlik veren şey, hiçbir şey vermeyerek aynı şeyi yapar. def
tam olarak, blokun dışında bir def
gibi davranır, bu da kendiliğinden, yöntemi tanımladığınız şeyi değiştirmez. Yapabilecekleriniz:
class Foo
def initialize
yield self if block_given?
end
end
x = Foo.new {|obj| def obj.foo() 'foo' end}
x.foo
Örnek_eval arasındaki fark, alıcıyı açıkça belirtmeniz gerektiğidir.verim ile versiyonda
obj blokta bu durumda yeni oluşturulan Foo örneğidir olduğu vermiştir nesneyi olacak:
Düzenleme netleştirmek için. Kendilik aynı değere sahipken, bloğun dışında kalmıştı. Bloğun içindeki instance_eval sürüm self
ile yeni oluşturulan Foo örneği olacaktır.
"Açıklığa kavuşturmak için düzenleyin" ifadesinde, kendinizin bloğun içindeki objeye verildiğini mi kastediyorsunuz? Belki de sadece farklı bir yoldan okuyorum ama başlangıçtaki nesneyi görüyorum, kendiliğinden bloğa 'obj' denir ve sonra bloğun içinde foo'nun kendiliğinden obj üzerinden tanımlanması yöntemi vardır. – uzo
Eminim, aynı şeyi kastediyoruz. "Yeni yaratılan Foo örneğini" yazdım çünkü başlatma yönteminin içinde (yeni oluşturulan Foo örneğidir) blok içinde kendiliğiyle aynı değildir ve eğer "ben" derken, hangisini kastettiğiniz belirsizdir. – sepp2k