Duplicata possible:
Que signifie l'opérateur en rubis?) ==
Je suis confus avec l'utilisation de ||=
opérateur dans Rails. Je n'ai rien trouvé d'utile sur le Web. Quelqu'un peut-il me guider?
Faites-moi savoir s'il existe des liens Internet dont vous avez connaissance.
J'aimerais ce que signifie la déclaration suivante:
@_current_user ||= session[:current_user_id] &&
User.find(session[:current_user_id])
Permet de le décomposer:
@_current_user ||= {SOMETHING}
Cela signifie, définissez @_current_user
Sur {SOMETHING}
S'il est nil
, false
ou indéfini. Sinon, définissez-le sur @_current_user
, Ou en d'autres termes, ne faites rien. Une forme développée:
@_current_user || @_current_user = {SOMETHING}
Ok, maintenant sur le côté droit.
session[:current_user_id] &&
User.find(session[:current_user_id])
Vous voyez généralement &&
Avec des valeurs booléennes uniquement, mais en Ruby vous n'avez pas à le faire. L'astuce ici est que si session[:current_user_id]
N'est pas nul et User.find(session[:current_user_id])
n'est pas nul, l'expression sera évaluée à User.find(session[:current_user_id])
sinon nulle.
Donc, tout cela dans un pseudo-code:
if defined? @_current_user && @_current_user
@_current_user = @_current_user
else
if session[:current_user_id] && User.find(session[:current_user_id])
@_current_user = User.find(session[:current_user_id])
else
@_current_user = nil
end
end
Il s'agit de capacités de mise en cache.
a ||= 1 # a assign to 1
a ||= 50 # a is already assigned, a will not be assigned again
puts a
#=> 1
ceci est utile lorsque vous chargez l'utilisateur actuel à partir de la base de données, si cela est chargé auparavant, l'instruction n'essaiera pas d'évaluer la partie droite de l'équation, qui SECHE, donc vous pouvez la considérer comme un opérateur de mise en cache.
REF: http://railscasts.com/episodes/1-caching-with-instance-variables
C'est un Ruby "modèle de code".
a ||= b
est le même que
a = a || b
Et ce qu'il fait, c'est initialiser a à b si a est nil. Ceci est important si nous voulons utiliser la valeur de a. Disons que nous voulons une opération comme a += " and more text"
. Cela mourra si a est nil, donc nous pourrions utiliser a ||= ""
en premier.
Si vous avez de l'expérience en C #, je pense que c'est similaire (mais plus d'un Ruby-trick) à l'opérateur null-coalescing (??) en C #
int? y = x ?? -1
x est affecté à y si x n'est pas nul, sinon la valeur "par défaut" de -1 est utilisée.
De même, || = est appelé l'opérateur T-carré je crois.
a || = b
ou
a || a = b
Venir à votre déclaration
@_current_user ||= session[:current_user_id] &&
User.find(session[:current_user_id])
Fondamentalement, il voit si @_current_user est nul ou non. S'il a une valeur, laissez-le tranquille (l'utilisateur actuel.) Sinon, récupérez l'utilisateur actuel de la session en utilisant l'ID utilisateur. Il voit d'abord si l'id est dans la session, puis obtient de l'utilisateur.
Regardez le blog ci-dessous pour plus d'informations sur l'opérateur "T-square":
http://blogs.Oracle.com/prashant/entry/the_Ruby_t_square_operator