web-dev-qa-db-fra.com

Quand utilisons-nous l'opérateur "|| =" dans Rails? Quelle est sa signification?

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])
41
geeky_monster

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
79
Mike Lewis

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

12
c2h2

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.

9
DigitalRoss

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

2
manojlds