Co to za dwukropek ::
? Np Foo::Bar
.
Znalazłem definicję :
::
Jest operatorem, które pozwala na: stałe, przykład sposoby oraz metody klasy zdefiniowane w klasie lub modułu, aby uzyskać z dowolnego miejsca na zewnątrz klasy lub modułu.
Czym jest zakres (prywatny, chroniony), jeśli można po prostu ::
coś ujawnić?
Odpowiedzi:
::
jest w zasadzie operatorem rozpoznawania przestrzeni nazw. Umożliwia dostęp do elementów w modułach lub przedmiotów na poziomie klasy w klasach. Załóżmy na przykład, że masz tę konfigurację:Możesz uzyskać dostęp
CONSTANT
spoza modułu jakoSomeModule::InnerModule::MyClass::CONSTANT
.Nie wpływa to na metody instancji zdefiniowane w klasie, ponieważ uzyskuje się dostęp do metod o innej składni (kropka
.
).Odpowiednia uwaga: jeśli chcesz wrócić do przestrzeni nazw najwyższego poziomu, zrób to: :: SomeModule - Benjamin Oakes
źródło
::
do rozpoznawania przestrzeni nazw, takie jakstd::cout << "Hello World!";
::SomeModule
Ten prosty przykład ilustruje to:
Zaczerpnięte z http://www.tutorialspoint.com/ruby/ruby_operators.htm
źródło
::
Umożliwia dostęp do stałej, modułu lub klasy zdefiniowanej w innej klasie lub module. Służy do zapewniania przestrzeni nazw, dzięki czemu nazwy metod i klas nie powodują konfliktu z innymi klasami różnych autorów.Kiedy widzisz
ActiveRecord::Base
w Railsach, oznacza to, że Rails ma coś takiegotj. klasa wywoływana
Base
w module, doActiveRecord
którego następnie się odwołujeActiveRecord::Base
(można to znaleźć w źródle Railsów w activerecord-nnn / lib / active_record / base.rb)Powszechnym zastosowaniem :: jest dostęp do stałych zdefiniowanych w modułach np
::
Operator nie pozwalają na widoczność obejścia metod oznaczone jako prywatne lub chronione.źródło
class MyClass < ActiveRecord::Base
, to czy to oznacza, że MyClass dziedziczy metody tylko z klasy, a nie z niczego w module ActiveRecord?class Foo; Baz = 42; def self.Baz; "Baz method!"; end; end
(doskonale ważne)Foo::Baz # => 42
iFoo.Baz # => "Baz method!"
. Zauważ, żeFoo::Baz()
(w nawiasach) również wywołałaby tę metodę.W Ruby wszystko jest widoczne i wszystko można modyfikować z dowolnego miejsca.
Jeśli martwisz się faktem, że klasy można zmieniać spoza „definicji klasy”, to Ruby prawdopodobnie nie jest dla ciebie.
Z drugiej strony, jeśli frustruje Cię blokowanie klas Javy, to prawdopodobnie Ruby jest tym, czego szukasz.
źródło
attr_accessor
czyni jedynie metody modyfikujące zmienną. (Potem znowu jestinstance_eval
)instance_eval
. Ale jest teżinstance_variable_get
iinstance_variable_set
. Ruby jest po prostu zbyt dynamiczny dla ograniczeń.Dodając do poprzednich odpowiedzi, można używać Ruby w
::
celu uzyskania dostępu do metod instancji. Obowiązują wszystkie poniższe warunki:Zgodnie z najlepszymi praktykami uważam, że zalecana jest tylko ostatnia.
źródło
Nie, nie ma dostępu do każdej metody, jest to operator „rozdzielczości”, to znaczy używasz go do rozwiązania zakresu (lub lokalizacji, którą możesz powiedzieć) symbolu stałego / statycznego.
Na przykład w pierwszym wierszu Railsy używają go do znajdowania klasy Base wewnątrz ActiveRecord.Module, w drugim używają go do zlokalizowania metody klasy (statycznej) klasy Routes itp.
Nie służy do niczego eksponowania, służy do „lokalizowania” rzeczy wokół zasięgu.
http://en.wikipedia.org/wiki/Scope_resolution_operator
źródło
O dziwo, wszystkie 10 odpowiedzi tutaj mówią to samo. „::” jest operatorem rozpoznawania przestrzeni nazw i tak, to prawda. Ale jest jeden problem, który musisz wiedzieć o operatorze rozpoznawania przestrzeni nazw, jeśli chodzi o algorytm ciągłego wyszukiwania . Jak opisuje Matz w swojej książce „The Ruby Programming Language”, ciągłe wyszukiwanie ma wiele kroków. Po pierwsze, przeszukuje stałą w zakresie leksykalnym, do którego odwołuje się stała. Jeśli nie znajdzie stałej w zakresie leksykalnym, przeszukuje hierarchię dziedziczenia . Z powodu tego algorytmu ciągłego wyszukiwania poniżej otrzymujemy oczekiwane wyniki:
Podczas gdy F dziedziczy z E, moduł B mieści się w zakresie leksykalnym F. W związku z tym instancje F będą odnosić się do stałej PI zdefiniowanej w module B. Teraz, jeśli moduł B nie zdefiniował PI, wówczas instancje F będą odnosić się do PI stała zdefiniowana w nadklasie E.
Ale co, jeśli użyjemy „::” zamiast zagnieżdżać moduły? Czy uzyskalibyśmy ten sam wynik? Nie!
Dzięki zastosowaniu operatora rozpoznawania przestrzeni nazw podczas definiowania zagnieżdżonych modułów, zagnieżdżone moduły i klasy nie są już objęte zakresem leksykalnym ich zewnętrznych modułów. Jak widać poniżej, PI zdefiniowane w A :: B nie znajduje się w zakresie leksykalnym A :: B :: C :: D i dlatego otrzymujemy niezainicjowaną stałą podczas próby odwołania się do PI w metodzie instancji get_pi:
źródło
Chodzi przede wszystkim o to, by definicje nie kolidowały z innym kodem powiązanym z twoim projektem. Oznacza to, że możesz oddzielić rzeczy od siebie.
Na przykład możesz mieć w kodzie jedną metodę o nazwie „uruchom” i nadal będziesz mógł wywoływać tę metodę zamiast metody „uruchom”, która została zdefiniowana w innej bibliotece, do której się połączyłeś.
źródło
:: Służy do tworzenia zakresu. Aby uzyskać dostęp do Constant EATER z 2 modułów, musimy rozszerzyć zakres modułów, aby osiągnąć stałą
źródło
Ruby on rails używa
::
do rozpoznawania przestrzeni nazw.Aby go użyć:
Inne użycie to: Podczas korzystania z zagnieżdżonych tras
OmniauthCallbacksController
jest zdefiniowany w ramach użytkowników.I kierowany jako:
źródło