Co oznacza ten zapis w wolnym tlumaczeniu

@link ||= Link.find(params[:id])

Swego czasu, gdy przeglądałem kod napisany w języku Ruby, zauważyłem użycie operatora ||=, który bardzo mnie zaciekawił. Myślę, że nie zaskoczę nikogo mówiąc, że w pierwszej chwili jego część || skojarzyła mi się z reprezentacją alternatywy logicznej - jak się później okazało, ma to swój sens, gdy już się wie do czego ten operator służy. A mianowicie odpowiada on za przypisanie wartości do zmiennej, jeżeli żadna wartość nie była przypisana wcześniej (czyli zmienna ma wartość nil).

Twoje wyjaśnienie jest niepoprawne. W takim przypadku:

@link = false
@link ||= Link.find(params[:id])

nastąpi w drugiej linijce przypisanie mimo że @link miało wartość inną niż nil.

A teraz:

@zmienna = nill
=> nil
@zmienna ||= 123
=> 123
@zmienna ||= 456
=> 123

W tym konkretnym przypadku do raz przypisanej wartości nie przypiszemy innej wartosci.

Do każdej zmiennej, która nie ma wartości true (jako stanu).

Po drugie, dopóki zmienna nie jest zainicjowana, nie ma żadnej wartości. Null oznacza tyle co że albo wartości nie ma albo jest nieustalona (i jest to bazodanowy koncept).

Jeśli znasz SQL, to poszukaj informacji czemu nie można używać w WHERE takiego warunku:
name = NULL, a zamiast tego
name IS NULL

Zapis foo ||= 1 można rozwinąć do foo = foo || 1. Teraz chyba jasne, dlaczego nie chodzi tylko o “raz przypisaną wartość”.

Tak dokładniej rzecz biorąc ten operator wyrażenie foo ||= bar rozwija do foo || foo = bar. Czyli gdy foo zwraca inną wartość niż nil lub false to przypisania nie ma.

1 Like