Odpowiedzi:
title
jest zmienną lokalną. Istnieją tylko w jego zakresie (bieżący blok)
@title
jest zmienną instancji - i jest dostępna dla wszystkich metod w klasie.
Możesz przeczytać więcej tutaj: http://strugglingwithruby.blogspot.dk/2010/03/variables.html
W Ruby on Rails - zadeklarowanie zmiennych w kontrolerze jako zmiennych instancji ( @title
) powoduje, że są one dostępne dla twojego widoku.
Użyj @title
w kontrolerach, jeśli chcesz, aby zmienna była dostępna w twoich widokach.
Wyjaśnienie jest takie, że @title
jest to zmienna instancji i zmienna title
lokalna, a szyny udostępniają zmienne instancji z kontrolerów do widoków. Dzieje się tak, ponieważ kod szablonu (erb, haml itp.) Jest wykonywany w ramach bieżącej instancji kontrolera.
Różnica leży w zakresie zmiennej. Wersja @ jest dostępna dla wszystkich metod instancji klasy.
Krótka odpowiedź, jeśli jesteś w kontrolerze i musisz udostępnić zmienną do widoku, a następnie użyj @variable
.
Aby uzyskać znacznie dłuższą odpowiedź, spróbuj tego: http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html
@variable
s są nazywane zmiennymi instancji w Rubim. Co oznacza, że możesz uzyskać dostęp do tych zmiennych w DOWOLNEJ METODIE wewnątrz klasy. [We wszystkich metodach w klasie]
Zmienne bez @
symbolu są nazywane zmiennymi lokalnymi, co oznacza, że możesz uzyskać dostęp do tych zmiennych lokalnych tylko w TYM ZADEKLAROWANEJ METODIE. Ograniczony do zakresu lokalnego.
Przykład zmiennych instancji:
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
W powyższym przykładzie @cust_id
, @cust_name
, @cust_addr
są dostępne w inny sposób w ramach klasy. Ale to samo nie byłoby dostępne w przypadku zmiennych lokalnych.
Samouczek dotyczący tego, czym jest zmienny zakres? całkiem dobrze prezentuje niektóre szczegóły, po prostu załącz pokrewne tutaj.
+------------------+----------------------+
| Name Begins With | Variable Scope |
+------------------+----------------------+
| $ | A global variable |
| @ | An instance variable |
| [a-z] or _ | A local variable |
| [A-Z] | A constant |
| @@ | A class variable |
+------------------+----------------------+
Zmienna lokalna jest dostępna tylko z poziomu bloku jej inicjalizacji. Również zmienna lokalna zaczyna się od małej litery (az) lub podkreślenia (_).
Zmienna instancji jest instancją self
i zaczyna się @
od Zmienna instancji należy również do samego obiektu. Zmienne instancji są tymi, które wykonujesz metodami np. .send
Itp
przykład:
@user = User.all
Jest @user
to zmienna instancji
Zmienne niezainicjowanej instancji mają wartość Nil
@title
& title
?
@title
czytitle
Zmienne @ są zmiennymi instancji, bez zmiennych lokalnych.
Czytaj więcej na http://ruby.about.com/od/variables/a/Instance-Variables.htm