Bazen bir değişkene bir şey atamak istiyorsam ancak önce atamak istediğim değeri hesaplamak zorundayım. Kodu bu şekilde biraz daha düzenli hale getirir. Bence kullanıcı tercihi. Temel olarak diyorsunuz: Ben bir şeyler atamadım, ama istediğim değeri elde etmek için ilk önce bazı şeyler yapmam gerekiyor. bunun yerine
if @cache.nil?
do_something!
@cache = read_value
end
arasında, Memoization yaparken It
@cache ||= begin
do_something!
read_value
end
Burada ne yararlanmakta olup Yakut tercüman bir yığın olmasıdır yapabileceği özellikle yararlıdır ve her ifade genellikle bir şey itecektir Yığın veya yığından bir şey alın. Atama sadece son şeyi yığından alır ve atayacaktır (bu durumda başlangıç / sondan son satır). Bunu çoğu kez bilmek (Ruby'de yığın yaklaşımı) yararlı olabilir.
En azından ihmalkarlığı ihlal etse de, sanırım onu kullanmak isteyip istemediğiniz kullanıcı tercihidir.
Sen buna Ruby MRI 1.9 oluşturduğu neler baytkodu talimatları bakarak beklenmedik bir şey yapmaz görebilirsiniz:
RubyVM::InstructionSequence::compile("c = begin; a = 5; 6; end").to_a
[:trace, 1],
[:trace, 1],
[:putobject, 5],
[:setlocal, 2],
[:trace, 1],
[:putobject, 6],
[:dup],
[:setlocal, 3],
[:leave]
İz yığın izlerini adildir, bunu göz ardı edebilirsiniz. Dup, yığındaki son öğeyi çoğaltır. Bu örnekte, a
yerel değişkenin numarası 2
ve c
yerel değişkenin numarası 3
'dir (dolayısıyla a
değişkenine atanacaktır). a = 5; c = 6
ile karşılaştırıldığında bunun tek yan etkisi, dup
yönergesidir; bu, yönteminizin yığın boyutunun 1 yuvalı daha büyük olacağı anlamına gelir. Fakat bu özellikle önemli değildir, çünkü yorumlayıcı bu özel yöntemde iken herhangi bir etkiye sahiptir ve yığın için bellek zaten önceden ayrılmış olduğundan, yalnızca yığın göstergesinin aksi takdirde 1'den daha fazla azaltılacağı anlamına gelir. Yani temelde hiç bir değişiklik yok. En iyi duruma getirme seçenekleri dup
olsa bile muhtemelen kaybolacaktır.
Daha önce hiç böyle bir kod görmedim. Bir genel kaynak dosyasına işaret edebilir misiniz? –
@SergioTulentsev: Bir kaynak dosya bulana kadar, bir blog yorumu: http://blog.rubybestpractices.com/posts/rklemme/003-The_Universe_between_begin_and_end.html # comment-9011441 – pje
Nasıl tehlikeli olacağını bilmiyorum, ama IMO yanlış: bir yöntem olmalı. –