@ variabel dalam Ruby on Rails


294

Apa perbedaan antara @titledan title? Karena keduanya dapat berupa nama variabel. Juga, bagaimana saya memutuskan variabel apa yang harus saya gunakan? Dengan @atau tidak?


Saya akan mengatakan tutorial ini cukup rapi untuk menjelaskan semua ini: techotopia.com/index.php/…
Hearen

Jawaban:


427

titleadalah variabel lokal. Mereka hanya ada dalam ruang lingkupnya (blok saat ini)

@title adalah variabel instan - dan tersedia untuk semua metode di dalam kelas.

Anda dapat membaca lebih lanjut di sini: http://strugglingwithruby.blogspot.dk/2010/03/variables.html

Di Ruby on Rails - mendeklarasikan variabel Anda di controller Anda sebagai variabel instan ( @title) membuatnya tersedia untuk Anda lihat.


4
Terima kasih atas jawabannya, punya pertanyaan tindak lanjut ... Di dalam kelas yang saya kerjakan, variabel anggota awalnya dibangun seperti @options = {...}. Namun setelah ini, metode dalam kelas mengakses dan membuat panggilan fungsi dengan variabel itu seolah-olah itu lokal (yaitu "options.merge ()"). Apakah ini bentuk yang buruk? Apakah ada sihir sintaksis lain yang masuk? (Yaitu seperti membuat dup diam variabel, atau membuatnya 'const' sehingga tidak dapat dimodifikasi, dll)? Saya datang dari perspektif C / C ++ & Java, dan sintaks yang benar-benar kabur dan opsional membuat saya gila!
Dan Devine

Apakah kelas Anda memiliki attr_accessor yang didefinisikan dengan nama yang sama @DanDevine? attr_accessor adalah gula sintaksis yang menghasilkan pengambil \ setter untuk Anda. Jika Anda mendapatkan nilai tanpa simbol @ kode menerima variabel karena memanggil pengambil. Catatan ini tidak bekerja sebaliknya, Anda perlu secara eksplisit menggunakan simbol @ jika Anda mengatur var atau Anda hanya akan menetapkan var lokal. Apakah gaya ini bagus? Sulit untuk dikatakan. Saya lebih suka menggunakan sintaks getter dalam metode saya dalam kasus pengambil rajutan - saya suka menghormati enkapsulasi itu, bahkan di dalam kelas itu sendiri. YMMV
Msencenb

30

Gunakan @titledi pengontrol Anda ketika Anda ingin variabel Anda tersedia di tampilan Anda.

Penjelasannya adalah bahwa itu @titleadalah variabel instan dan titlemerupakan variabel lokal dan rel membuat variabel instan dari pengontrol tersedia untuk dilihat. Ini terjadi karena kode templat (erb, haml, dll) dieksekusi dalam lingkup instance pengontrol saat ini.


Terima kasih untuk ini! Ini adalah satu-satunya jawaban yang menjelaskan mengapa @variables yang didefinisikan di kelas controller dapat diambil oleh kode dalam view.
AlexC


14

@variables disebut variabel instan dalam ruby. Yang berarti Anda dapat mengakses variabel-variabel ini dalam METODE APA PUN di dalam kelas. [Melintasi semua metode di kelas]

Variabel tanpa @simbol disebut variabel lokal, yang berarti Anda dapat mengakses variabel lokal ini hanya dalam METODE YANG DEKLARKAN. Terbatas pada lingkup lokal.

Contoh Variabel Instans:

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

Dalam contoh di atas @cust_id, @cust_name, @cust_addrdiakses di metode lain dalam kelas. Tetapi hal yang sama tidak akan dapat diakses dengan variabel lokal.


10

Tutorial tentang Apa Lingkup Variabel? menyajikan beberapa detail dengan cukup baik, cukup lampirkan yang terkait di sini.


+------------------+----------------------+
| 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

Variabel lokal hanya dapat diakses dari dalam blok inisialisasi itu. Variabel lokal juga dimulai dengan huruf kecil (az) atau garis bawah (_).

Dan variabel instan adalah instance dari selfdan dimulai dengan @variabel instance juga milik objek itu sendiri. Variabel Instance adalah variabel yang Anda lakukan metode misalnya .senddll

contoh:

@user = User.all

Ini @useradalah variabel instan

Dan variabel instance tidak diinisialisasi memiliki nilai Nil


Jadi bagaimana ini menjelaskan perbedaan antara @title& title?
Richard Peck

Dengan variabel instan seperti @title, Anda dapat melakukan berbagai metode di atasnya, sedangkan variabel lokal tidak
Joe Hilton

1
Jadi, bagaimana hal itu benar-benar memperbaiki pertanyaan? Sepertinya Anda hanya mengutip beberapa tutorial. OP ingin tahu apakah ia harus menggunakan @titleatautitle
Richard Peck

Jadi mereka harus menggunakan variabel instan jika mereka ingin melakukan metode apa pun, misalnya def baru atau def buat, dll
Joe Hilton

3
Tidak ada yang menghentikan Anda dari melakukan pengguna = User.all dan melakukan metode pada pengguna tetapi ini bukan intinya.
Jaro

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.