Natknąłem się na tę linię kodu rubinowego. Co to ma &.
znaczyć?
@object&.method
Nazywa się Operator Bezpiecznej Nawigacji. Wprowadzony w Ruby 2.3.0, pozwala na wywoływanie metod na obiektach bez obawy, że obiekt może być nil
(Unikanie undefined method for nil:NilClass
błędu), podobnie jak try
metoda w Railsach .
Więc możesz pisać
@person&.spouse&.name
zamiast
@person.spouse.name if @person && @person.spouse
Z Dokumentów :
my_object.my_method
Spowoduje to wysłanie wiadomości my_method do my_object. Każdy obiekt może być odbiornikiem, ale w zależności od widoczności metody wysłanie wiadomości może zgłosić NoMethodError.
Możesz użyć &. aby wyznaczyć odbiorcę, wówczas my_method nie jest wywoływana, a wynik jest zerowy, gdy odbiornik jest zerowy. W takim przypadku argumenty my_method nie są oceniane.
try!
metoda, a nietry
Uwaga: Mimo że @Santosh udzielił jasnej i pełnej odpowiedzi, chciałbym dodać więcej tła i dodać ważną uwagę dotyczącą jego użycia ze zmiennymi innymi niż instancje.
Nazywa się to „ Bezpiecznym operatorem nawigacji ” ( inaczej „Opcjonalny operator łańcuchowy”, „Operator warunkowy zerowy” itp .). Matz zdaje się nazywać to „samotnym operatorem”. Został wprowadzony w Rubim 2.3 . Wysyła metodę do obiektu tylko wtedy, gdy tak nie jest
nil
.Przykład:
„Przypadek skrajny” ze zmiennymi lokalnymi:
Zwróć uwagę, że powyższy kod używa zmiennych instancji. Jeśli chcesz używać bezpiecznego operatora nawigacji ze zmiennymi lokalnymi, musisz najpierw sprawdzić, czy zmienne lokalne są zdefiniowane.
Aby rozwiązać ten problem, sprawdź, czy zmienna lokalna jest zdefiniowana jako pierwsza, lub ustaw ją na zero:
Tło metody
Railsy mają
try
metodę, która w zasadzie robi to samo. Używasend
metody wewnętrznie do wywołania metody. Matz zasugerował, że jest to powolne i powinno to być wbudowaną funkcją języka.Wiele innych języków programowania ma podobną funkcję: Objective C, Swift, Python, Scala, CoffeeScript itp. Jednak typową składnią jest
?.
(kropka zapytania). Ale Ruby nie mógł przyjąć tej składni. Ponieważ?
było to dozwolone w nazwach metod,?.
sekwencja symboli jest już poprawnym kodem Rubiego. Na przykład:Dlatego społeczność Rubiego musiała wymyślić inną składnię. To była aktywna dyskusja i rozważono różne warianty (
.?
,?
,&&
, itd.). Oto lista kilku uwag:Wybierając składnię, programiści przyjrzeli się różnym skrajnym przypadkom i dyskusja jest bardzo przydatna. Jeśli chcesz przejrzeć wszystkie warianty i niuanse operatora, zapoznaj się z dyskusją wprowadzającą do funkcji dotyczącą oficjalnego narzędzia do śledzenia problemów w Rubim.
źródło
.?
i rozważono inne opcje, ale&.
wybrano! Więc tylko&.
zadziała.&.
a nie.?
, moja wina. Zaktualizowałem moją odpowiedź. Dzięki za ostrzeżenie!user.?profile
powinno byćuser&.profile
(nie mogłem tego samodzielnie edytować, ponieważ jest to edycja 1 znaku!).Uważać! Chociaż bezpieczny operator nawigacji jest wygodny, można też łatwo oszukać siebie i zmienić za jego pomocą logikę. Zalecam unikanie używania tego w kontroli przepływu. Przykład:
W pierwszym przykładzie
str.nil?
zwracatrue
istr.empty?
nigdy nie jest wywoływana, powodując wykonanieputs
instrukcji. Jednak w drugim przykładziestr&.empty?
zwraca wynik,nil
który jest fałszywy, aputs
instrukcja nigdy nie jest wykonywana.źródło
str.nil?
jest prawda (jak mówisz), co oznacza,str.empty?
że w rzeczywistości nie zostanie w ogóle wywołany (tak||
działa operator). Reszta twojego stwierdzenia jest poprawna.puts "hello" unless str&.present?
(szyny tylko dla obecnej metody?)używany do sprawdzenia zerowego, na przykład w kotlin i swift; z Object -> Swift i Kotlin
ten model może być zerowy (Swift) lub zerowy (Kotlin), jeśli nie zdefiniowaliśmy wartości modelu w klasie samochodu. używamy tego ampersandu zamiast znaku zapytania w rubinie
jeśli używasz car.model bez znaku ampersand i jeśli model jest zerowy, system nie może kontynuować pracy.
źródło