@ zmienne w Ruby on Rails

294

Jaka jest różnica między @titlei title? Ponieważ oba mogą być nazwami zmiennych. Ponadto, jak zdecydować, jakiego rodzaju zmiennej powinienem użyć? Z @czy nie?

OneZero
źródło
Powiedziałbym, że ten samouczek jest całkiem fajny, aby wyjaśnić wszystkie te: techotopia.com/index.php/…
Hearen

Odpowiedzi:

426

titlejest 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.

Peter Rasmussen
źródło
4
Dzięki za odpowiedź, zadaj pytanie ... W klasie, nad którą pracuję, zmienna składowa jest początkowo skonstruowana jak @options = {...}. Po tym jednak metody w klasie uzyskują dostęp i wywołują funkcje z tą zmienną tak, jakby była lokalna (tj. „Options.merge ()”). Czy to po prostu zła forma? Czy pojawia się jakaś inna magia składniowa? (np. jak wykonanie cichego duplikatu zmiennej lub uczynienie go „stałym”, aby nie można go było modyfikować itp.)? Pochodzę z perspektywy C / C ++ i Java, a naprawdę niejasna i opcjonalna składnia doprowadza mnie do szału!
Dan Devine
Czy twoja klasa ma zdefiniowany attr_accessor o tej samej nazwie @DanDevine? attr_accessor to cukier składniowy, który generuje dla ciebie getter \ setter. Jeśli otrzymujesz wartość bez symbolu @, kod otrzymuje zmienną, ponieważ wywołuje getter. Zauważ, że to nie działa w drugą stronę, musisz jawnie użyć symbolu @, jeśli ustawiasz var, albo po prostu ustawisz lokalny var. Czy to dobry styl? Ciężko powiedzieć. Wolę używać składni gettera w moich metodach na wypadek, gdyby getter został przesłonięty - lubię szanować tę enkapsulację, nawet w samej klasie. YMMV
Msencenb
30

Użyj @titlew kontrolerach, jeśli chcesz, aby zmienna była dostępna w twoich widokach.

Wyjaśnienie jest takie, że @titlejest to zmienna instancji i zmienna titlelokalna, 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.

joscas
źródło
Dzięki za to! To jedyna odpowiedź, która wyjaśnia, dlaczego zmienne @ zdefiniowane w klasie kontrolera mogą być pobierane przez kod w widokach.
AlexC
14

@variables 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_addrsą dostępne w inny sposób w ramach klasy. Ale to samo nie byłoby dostępne w przypadku zmiennych lokalnych.

Prabhakar Undurthi
źródło
9

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     |
+------------------+----------------------+
Hearen
źródło
4

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ą selfi zaczyna się @od Zmienna instancji należy również do samego obiektu. Zmienne instancji są tymi, które wykonujesz metodami np. .sendItp

przykład:

@user = User.all

Jest @userto zmienna instancji

Zmienne niezainicjowanej instancji mają wartość Nil

Joe Hilton
źródło
Jak to wyjaśnia różnicę między @title& title?
Richard Peck,
Za pomocą zmiennej instancji, takiej jak @title, możesz wykonywać na niej różne metody, podczas gdy zmiennej lokalnej nie
Joe Hilton
1
Jak to naprawia pytanie? Wygląda na to, że cytujesz tylko samouczek. OP chce wiedzieć, czy powinien skorzystać, @titleczytitle
Richard Peck
Dlatego powinni użyć zmiennej instancji, jeśli chcą wykonać dowolną metodę, tj. Zdefiniować nową lub zdefiniować itp.
Joe Hilton
3
Nic nie stoi na przeszkodzie, aby wykonać user = User.all i wykonać metody dla użytkownika, ale nie o to chodzi.
Jaro