@ biến trong Ruby on Rails


294

Sự khác biệt giữa @titlevà là titlegì? Vì cả hai đều có thể là tên biến. Ngoài ra, làm thế nào để tôi quyết định loại biến nào tôi nên sử dụng? Có @hay không?


Tôi muốn nói rằng hướng dẫn này khá gọn gàng để giải thích tất cả những điều này: techotopia.com/index.php/ Kẻ
Nghe

Câu trả lời:


426

titlelà một biến cục bộ. Chúng chỉ tồn tại trong phạm vi của nó (khối hiện tại)

@title là một biến thể hiện - và có sẵn cho tất cả các phương thức trong lớp.

Bạn có thể đọc thêm tại đây: http://strugglingwithruby.blogspot.dk/2010/03/variables.html

Trong Ruby on Rails - khai báo các biến của bạn trong bộ điều khiển của bạn dưới dạng các biến thể hiện ( @title) làm cho chúng có sẵn cho chế độ xem của bạn.


4
Cảm ơn câu trả lời, có câu hỏi tiếp theo ... Trong một lớp mà tôi đang làm việc, biến thành viên ban đầu được xây dựng như @options = {...}. Sau đó, các phương thức trong lớp truy cập và thực hiện các cuộc gọi hàm với biến đó như thể nó là cục bộ (tức là "tùy chọn.merge ()"). Đây chỉ là hình thức xấu? Có một số phép thuật cú pháp khác đi vào? (nghĩa là tạo ra một bản sao biến đổi im lặng hoặc biến nó thành 'const' để nó không thể được sửa đổi, v.v.)? Tôi đến từ viễn cảnh C / C ++ và Java, và cú pháp thực sự mơ hồ và tùy chọn đang khiến tôi phát điên!
Dan Devine

Lớp của bạn có một attr_accessor được định nghĩa với cùng tên @DanDevine không? attr_accessor là đường cú pháp tạo ra getter \ setter cho bạn. Nếu bạn nhận được giá trị mà không có ký hiệu @, mã sẽ nhận được biến vì nó đang gọi getter. Lưu ý điều này không hoạt động theo cách khác, bạn cần sử dụng rõ ràng biểu tượng @ nếu bạn đang đặt var hoặc nếu không bạn sẽ chỉ đặt một var cục bộ. Đây có phải là phong cách tốt? Khó nói. Tôi thích sử dụng cú pháp getter trong các phương thức của mình trong trường hợp getter bị ghi đè - tôi thích tôn trọng sự đóng gói đó, ngay cả trong chính lớp đó. YMMV
Msencenb

30

Sử dụng @titletrong bộ điều khiển của bạn khi bạn muốn biến của bạn có sẵn trong chế độ xem của bạn.

Giải thích là @titlemột biến đối tượng và titlelà một biến cục bộ và đường ray làm cho các biến thể hiện từ các bộ điều khiển có sẵn cho các khung nhìn. Điều này xảy ra bởi vì mã mẫu (erb, haml, v.v.) được thực thi trong phạm vi của thể hiện của bộ điều khiển hiện tại.


Cảm ơn vì điều đó! Đây là câu trả lời duy nhất giải thích tại sao @ biến được định nghĩa trong lớp trình điều khiển có thể được chọn bằng mã trong các khung nhìn.
AlexC

25

Sự khác biệt là trong phạm vi của biến. @Version có sẵn cho tất cả các phương thức của thể hiện của lớp.

Câu trả lời ngắn, nếu bạn đang ở trong bộ điều khiển và bạn cần làm cho biến có sẵn cho chế độ xem thì hãy sử dụng @variable.

Để có câu trả lời dài hơn, hãy thử điều này: http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_groupes.html


14

@variables được gọi là các biến thể hiện trong ruby. Điều đó có nghĩa là bạn có thể truy cập các biến này trong BẤT K MET PHƯƠNG PHÁP nào trong lớp. [Trên tất cả các phương thức trong lớp]

Các biến không có @ký hiệu được gọi là các biến cục bộ, có nghĩa là bạn chỉ có thể truy cập các biến cục bộ này trong PHƯƠNG PHÁP KHAI THÁC. Giới hạn trong phạm vi địa phương.

Ví dụ về biến sơ thẩm:

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

Trong ví dụ trên @cust_id, @cust_name, @cust_addrđược truy cập trong phương pháp khác trong lớp. Nhưng điều tương tự sẽ không thể truy cập được với các biến cục bộ.


9

Hướng dẫn về Phạm vi biến là gì? trình bày một số chi tiết khá tốt, chỉ cần đính kèm các liên quan ở đây.


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

Một biến cục bộ chỉ có thể truy cập được từ bên trong khối khởi tạo của nó. Ngoài ra một biến cục bộ bắt đầu bằng một chữ cái viết thường (az) hoặc gạch dưới (_).

Và biến đối tượng là một thể hiện selfvà bắt đầu bằng một @biến thể hiện cũng thuộc về chính đối tượng đó. Các biến sơ thẩm là các biến mà bạn thực hiện các phương thức trên, .sendv.v.

thí dụ:

@user = User.all

Biến thể @user

Và các biến đối tượng Uninitialized có giá trị là Nil


Vậy làm thế nào để giải thích sự khác biệt giữa @title& title?
Richard Peck

Với một biến đối tượng như @title, bạn có thể thực hiện nhiều phương thức khác nhau trên đó, trong khi đó một biến cục bộ mà bạn không có
Joe Hilton

1
Vì vậy, làm thế nào mà thực sự sửa câu hỏi? Có vẻ như bạn chỉ trích dẫn một số hướng dẫn. OP muốn biết liệu anh ta nên sử dụng @titlehaytitle
Richard Peck

Vì vậy, họ nên sử dụng một biến đối tượng nếu họ muốn thực hiện bất kỳ phương thức nào Ie def new hoặc def tạo, v.v.
Joe Hilton

3
Không có gì ngăn bạn thực hiện user = User.all và thực hiện các phương thức trên người dùng nhưng đây không phải là vấn đề.
Jaro

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.