2011-03-11 12 views
5

Ruby on Rails 3 kullanıyorum ve diğer değişken türleri yerine örnek değişkenleri hangi durumlarda kullanmalıyım ve güvenlik nedenleri var mı?Başka değişken türleri yerine örnek değişkenleri hangi durumlarda kullanmalıyım?

Örnek: yerel bir değişken sadece lokal olduğunu ve bir işlev/nesne/blok kapsamı içinde kalıcı ise bir örneği değişken lokal, bir nesnenin bir örneği içinde kalıcı Genel olarak

# Using an instance variable 
@accounts = Account.find(...) 

# Using a "local"\"normal" variable 
account = Account.find(...) 
+0

Bir sınıf değişkeni, @@ hesaplarıdır. '@ account' bir örnek değişkendir. –

+0

Verdiğiniz ilk örnek, bir sınıf değişkeni değil, bir örnek değişkendir. İkincisi yerel bir değişkendir. Özellikle kontrolörlere, modellere ya da genel olarak sadece Ruby sınıflarına mı atıf yapıyorsunuz? –

+0

@LBg, @Pan Thomakos - Üzgünüm, benim hatamdı. Değişken madde konusunda uzman değilim. – user502052

cevap

9

. Örneğin: Greet fonksiyonu name olarak

class User 
    def name 
    @name 
    end 

    def name= name 
    @name = name 
    end 
end 

def greet user 
    name = user.name || 'John' 
    p "Hi, my name is #{name}" 
end 

user = User.new 
greet user 
=> 'Hi, my name is John' 
name 
=> NameError: undefined local variable or method 'name' for main:Object 
user.name = "Mike" 
greet user 
=> 'Hi, my name is Mike' 
@name 
=> nil 

sadece bu işlev içinde tanımlanan bir yerel bir değişkendir. İsim değişkeni, fonksiyonun ilk satırında name = user.name || 'John' olarak ayarlanmıştır, ancak fonksiyonun dışında değeri kalıcı değildir. name numaralı telefonu aramayı denediğinizde, NameError numarasını alırsınız, çünkü isim sadece karşılama işlevi içinde yerel bir değişken olarak tanımlanmıştır.

@name, User sınıfının kullanıcı örneğine yereldir. Bu bağlamın dışında çağırmayı denediğinizde nil elde edersiniz. Bu, yerel ve örnek değişkenler arasındaki bir farktır, örnek değişkenler, tanımlanmamışlarsa sıfırlanır, oysa yerel örnek olmayan değişkenler bir Hata oluşturur.

Her iki değişken türünün de belirli bir içeriğe yerel olduğuna dikkat edin. @name, kullanıcı örneğinde tanımlanmıştır, böylece user.name'u aradığınızda, kullanıcı örneğinde @name'un tanımlandığı ad işlevini çağırırsınız. name sadece selamlama fonksiyonunda tanımlıdır, bu yüzden p "Hi, my name is #{name}"'u aradığınızda name için bir değer elde edebilirsiniz, çünkü tanımlandığı kapsamdasınız.

+0

@ Davy8 bana yanıt verdi. – user502052

+2

Neden alıcının yönteminde sadece bir yerel değişken adı yerine @name kullanacağını açıklayabilir misiniz? Hem örnek değişkenler hem de yerel değişkenler kendi bağlamları içinde geçerli olduğundan, neden ikisi arasındaki ayrımı yapar? –

9
@ Pan'ın yanıtı, aralarındaki farkın iyi bir açıklamasını verir.

Genel olarak (hemen her dilde), değişkenleri en küçük kapsamda tanımlamak istersiniz. Yani, işlev çağrıları boyunca kalıcı bir şeye ihtiyacınız yoksa, o zaman yerelleştirin.

İşlev çağrılarında kalıcı olmak için bir değişkene gereksiniminiz varsa, ancak yalnızca belirli bir sınıf örneği için, bir örnek değişkeni yapın.

, bu sınıfın her bir örneği arasında paylaşılan bir şeye ihtiyacınız varsa, o zaman bir sınıf değişkeni kullanın, ancak bunun ihtiyacı biraz nadir olmalıdır, bu yüzden gerçekten bir sınıf değişkenine ihtiyacınız olup olmadığını dikkatlice düşünün.

(Feragatname: Sadece yaklaşık 2 hafta boyunca Ruby ile çalıştım, bu yüzden çoğunlukla bir dil agnostik yanıtıdır, fakat eminim ki Ruby için de geçerlidir. Yanlış olduğumda beni düzeltmekten çekinme.

İlgili konular