2011-01-28 12 views
5

Mam kilka odziedziczył kod, który modyfikuję. Jednak widzę coś dziwnego (dla mnie).Co robi :: zrobić?

widzę jakiś kod jak poniżej:

::User.find_by_email(params[:user][:email]).update_attributes(:mag => 1) 

Nigdy nie widziałem czegoś takiego (jestem nowy w Ruby on Rails). Co to oznacza i dlaczego nie działa moja User.find_by_email(params[:user][:email]).update_attributes(:mag => 1)? Błąd mówi coś o stałej User.

Używam Rails 2.3.5, jeśli to pomaga.

Odpowiedz

17

:: jest operatorem rozdzielczości zakres, to w rzeczywistości oznacza „w przestrzeni nazw”, więc ActiveRecord::Base oznacza „Base w przestrzeni nazw ActiveRecord

Stała jest rozwiązany poza jakimkolwiek nazw oznacza dokładnie to, co brzmi jak - stała w ogóle w żadnej przestrzeni nazw.

Jest używany w miejscach, w których kod może być niejednoznaczne bez niego:

module Document 
    class Table # Represents a data table 

    def setup 
     Table # Refers to the Document::Table class 
     ::Table # Refers to the furniture class 
    end 

    end 
end 

class Table # Represents furniture 
end 
2

Może się okazać prowadzenie tutaj: What is Ruby's double-colon `::`?

+1

To wyjaśnia, co :: robi, ale nie co :: bez identyfikatora przed robi. :) –

+1

To prawda. Nie używam Ruby, ale operator "::" wygląda na operatora rozdzielczości. Domyślam się, że ":: User" simpy oznacza globalny identyfikator użytkownika w bieżącym module. Czy ktoś może potwierdzić? –

+0

Mogę. Zobacz moją odpowiedź. :) –

4

on pilnuje, aby załadować model użytkownika w globalnej przestrzeni nazw.

Wyobraź sobie, że masz globalny model użytkownika i inny model użytkownika w bieżącym module (Foo :: User). Wywołując :: Użytkownik upewniasz się, że uzyskasz globalny.

+0

To samo rozumienie tutaj – YOU

2

Ruby używa (między innymi) leksykalnego zakresu celem znalezienia stałej nazwy. Na przykład, jeśli masz ten kod:

module Foo 
    class Bar 
    end 

    def self.get_bar 
    Bar.new 
    end 
end 

class Bar 
end 

W Foo.get_bar zwraca instancję Foo::Bar. Ale jeśli wstawimy :: przed stałą nazwą, zmusza ona Ruby do patrzenia tylko na najwyższy poziom dla stałej. Tak więc ::Bar zawsze odnosi się do klasy najwyższego poziomu Bar.

W sytuacjach w Ruby natrafisz na sytuacje, w których sposób, w jaki uruchamiany jest Twój kod, zmusi Cię do użycia tych "absolutnych" stałych odniesień, aby dostać się do wybranej klasy.

1

Operator "::" służy do uzyskiwania dostępu do klas wewnątrz modułów. W ten sposób możesz również pośrednio uzyskać dostęp do metod. Przykład:

module Mathematics 
    class Adder 
     def Adder.add(operand_one, operand_two) 
      return operand_one + operand_two 
     end 
    end 
end 

uzyskać dostęp ten sposób:

puts “2 + 3 = “ + Mathematics::Adder.add(2, 3).to_s