@ 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?

OneZero
sumber
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.

Peter Rasmussen
sumber
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.

joscas
sumber
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
25

Perbedaannya terletak pada ruang lingkup variabel. Versi @ tersedia untuk semua metode instance kelas.

Jawaban singkatnya, jika Anda berada di controller dan Anda perlu membuat variabel tersedia untuk tampilan kemudian gunakan @variable.

Untuk jawaban yang lebih lama coba ini: http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html

GSP
sumber
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.

Prabhakar Undurthi
sumber
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     |
+------------------+----------------------+
Dengarkan
sumber
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

Joe Hilton
sumber
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