2012-03-22 18 views
7

düzgün blokRuby'de sınıf bloğu nasıl başlatılır?

class Foo 
    attr_accessor :bar 
end 

obj = Foo.new do |a| 
    a.bar = "baz" 
end 

puts obj.bar 

"baz" yerine

yakut blok sınıf başlatıcıları için uygun büyü nedir nil olsun Expect başlatmak çözemiyorum?

+0

"attr_accessor" bu formda çalışamaz ve blok asla çağrılmaz. –

+0

Teşekkürler, bu konuda haklısınız, bu yüzden şimdi "işlevsel" kodu – Doug

+0

olduğu için düzeltildi Doğru, ben (neden çalışmadığını açıklıyor) çağrılmadım olsun. Aşağıdaki "musluk" fikrini beğeniyorum, çünkü FactoryGirl (varsayılan başlatıcılar gerektiren) araçlarını yeni geçersiz kılmaya gerek kalmadan kullanmamı sağlıyor. – Doug

cevap

9

:

class Foo 
    attr_accessor :bar 
end 

obj = Foo.new.tap do |a| 
    a.bar = "baz" 
end 

puts obj.bar 
+0

'daki bazı ruby ​​kodlarına bakın. Bu aynı değildir. Ayrıca, bir 'NameError' yükseltmelidir. –

+0

Kullanıcılarınızın belgeleri okumak için yeni yollar eklemeden en iyi yol bu. – Reactormonk

+0

Kabul ediyorum. –

2

new'un bir blok alabileceğini sanmıyorum. Hiçbir zaman onu hiçbir yerde görmedim. Neden bir blokta başlatmak istiyorsunuz? Tekrar deneyin

class Foo 
    attr_accessor :bar 

    def initialize(bar = "baz") 
    @bar = bar 
    end 

end 
+0

Bu, bir bloğu kullanamaz, sadece çirkin değil. Buna rağmen, sık görülen bir "deyim" dir. –

+0

Oh, tamam. Peki bugün bir şey öğrendim – ksol

+0

Neden bu çirkin? Bu, C# gibi kullandığım diğer dillerdeki yaygın bir deyim. – Doug

0

istiyorsanız her zaman aslında bu amaçlarla bir kurucuya sahip obj = foo.new.tap do |a| ... yapabilirsiniz kendiniz bir tane yazarak:

Ve sonra kullanmak:

foo = Foo.new do |f| 
    f.bar = true 
end 

Benim iki sent.

+0

Belki de bir parametre yapmalısınız. –

+0

Niklas, evet, bu daha iyi olurdu – Sergey

+0

Bu ortak olarak onları geçemezsiniz. Sadece github – slashmili

29

başka yolu da bir blok başlatıcısı olacağını yapmak gerçekten bir bloğunu

+0

şüphesiz, bu bir sınıfı bir blok ile başlatmanın daha iyi bir yoludur. –