Ruby on Rails'deki @ değişkenler


294

Arasındaki fark nedir @titleve title? Çünkü ikisi de değişken isimler olabilir. Ayrıca, ne tür bir değişken kullanmam gerektiğine nasıl karar verebilirim? İle @ya da değil?


Bu eğitimin tüm bunları açıklamak için oldukça düzgün olduğunu söyleyebilirim: techotopia.com/index.php/…
Hearen

Yanıtlar:


427

titleyerel bir değişkendir. Sadece kendi kapsamı dahilindedir (mevcut blok)

@title bir örnek değişkendir - ve sınıf içindeki tüm yöntemler tarafından kullanılabilir.

Daha fazla bilgiyi buradan okuyabilirsiniz: http://strugglingwithruby.blogspot.dk/2010/03/variables.html

Ruby on Rails - denetleyicinizdeki değişkenlerinizi örnek değişkenler ( @title) olarak bildirmek , bunları görünümünüz için kullanılabilir hale getirir.


4
Cevabınız için teşekkürler, takip sorunuz var ... Üzerinde çalıştığım bir sınıfta üye değişken başlangıçta @options = {...} gibi yapılandırılmıştır. Ancak bundan sonra, sınıf içindeki yöntemler bu değişkenle yerelmiş gibi işlev çağrıları yapar ve yapar (yani "options.merge ()"). Bu sadece kötü bir form mu? İçeri giren başka bir sözdizimsel sihir var mı? (örneğin, değişkeni sessiz hale getirmek veya değiştirilemeyecek şekilde 'const' yapmak gibi)? C / C ++ ve Java perspektifinden geliyorum ve gerçekten belirsiz ve isteğe bağlı sözdizimi beni deli ediyor!
Dan Devine

Sınıfınızda @DanDevine ile aynı adla tanımlanmış bir attr_accessor var mı? attr_accessor, sizin için bir alıcı \ ayarlayıcı üreten sözdizimsel şekerdir. Değeri @ sembolü olmadan alıyorsanız kod, getter'ı çağırdığı için değişkeni alır. Bunun başka bir yolla çalışmadığını unutmayın, var ayarını yapıyorsanız @ sembolünü açıkça kullanmanız gerekir, aksi takdirde yalnızca yerel bir var ayarı yaparsınız. Bu iyi bir tarz mı? Söylemesi zor. Alıcının geçersiz kılınması durumunda alıcının sözdizimini kullanmayı tercih ederim - sınıf içinde bile olsa bu kapsüllemeye saygı duymayı seviyorum. YMMV
Msencenb

30

@titleDeğişkenlerin görünümlerinizde kullanılabilir olmasını istediğinizde denetleyicilerinizde kullanın .

Açıklama, @titlebir örnek değişkeni ve titleyerel bir değişkendir ve raylar, denetleyicilerin örnek değişkenlerini görünümler için kullanılabilir hale getirir. Bunun nedeni, şablon kodunun (erb, haml, vb.) Geçerli denetleyici örneği kapsamında yürütülmesi nedeniyle olur.


Bunun için teşekkürler! Bu, denetleyici sınıfında tanımlanan @ değişkenlerin görünümlerde kod tarafından neden alınabileceğini açıklayan tek yanıttır.
AlexC


14

@variableyakutta örnek değişkenler olarak adlandırılır. Yani bu değişkenlere sınıf içindeki HERHANGİ BİR YÖNTEM'de erişebilirsiniz. [Sınıftaki tüm yöntemlerde]

@Sembolü olmayan değişkenlere yerel değişkenler denir, yani bu yerel değişkenlere yalnızca BU DECLARED METHOD içinde erişebilirsiniz. Yerel kapsamla sınırlıdır.

Örnek Değişkenlerine Örnek:

class Customer
  def initialize(id, name, addr)
    @cust_id = id
    @cust_name = name
    @cust_addr = addr
  end

  def display_details
    puts "Customer id #{@cust_id}"
    puts "Customer name #{@cust_name}"
    puts "Customer address #{@cust_addr}"
  end
end

Yukarıdaki örnekte @cust_id,@cust_name , @cust_addrsınıf içinde, başka bir yöntemde erişilir. Fakat aynı şey yerel değişkenlerle elde edilemezdi.


10

İlgili bir öğretici Ne Değişken Kapsamı nedir? bazı ayrıntıları oldukça iyi sunuyor, sadece ilgili olanları buraya ekleyin.


+------------------+----------------------+
| Name Begins With |    Variable Scope    |
+------------------+----------------------+
| $                | A global variable    |
| @                | An instance variable |
| [a-z] or _       | A local variable     |
| [A-Z]            | A constant           |
| @@               | A class variable     |
+------------------+----------------------+

4

Yerel bir değişkene yalnızca başlatma bloğundan erişilebilir. Ayrıca yerel bir değişken küçük harf (az) veya alt çizgi (_) ile başlar.

İnstance değişkeni bir örneğidir ve bir selfile başlar. @Ayrıca bir example değişkeni nesnenin kendisine aittir. Eşgörünüm değişkenleri, örn..send vb.

misal:

@user = User.all

The @userörnek değişkeni

Başlatılmamış örnek değişkenlerin değeri Nil


Peki bu, @title& arasındaki farkı nasıl açıklıyor title?
Richard Peck

@Title gibi bir örnek değişkeni ile bunun üzerinde çeşitli yöntemler gerçekleştirebilirsiniz, oysa yerel bir değişkendir
Joe Hilton

1
Peki bu aslında soruyu nasıl düzeltir? Görünüşe göre sadece bazı öğreticilerden alıntı yapıyorsunuz. OP diye kullanması gerekip gerekmediğini bilmek istiyor @titleyatitle
Richard Peck

Yani yeni veya def oluşturma vb herhangi bir yöntem uygulamak istiyorlarsa bir örnek değişkeni kullanmalıdırlar
Joe Hilton

3
Hiçbir şey user = User.all yapmanıza engel olmaz ve kullanıcı üzerinde yöntemler gerçekleştirir, ancak mesele bu değildir.
Jaro

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.