Símbolos de tubo duplo em atribuição variável Ruby?

Duplicar Possível:
O que significa || = em Ruby?

Perdoe-me se esta é uma pergunta nova, mas estou lendo um livro sobre rails onde o escritor usou essa expressão em um método auxiliar:

@current_user ||= User.find_by_id(session[:user_id]) 

Esse uso de pipes duplos ainda é uma instrução OR booleana?

Se sim, como isso funciona?

É uma tarefa condicional. A partir daqui :

  x = find_something() #=>nil x ||= "default" #=>"default" : value of x will be replaced with "default", but only if x is nil or false x ||= "other" #=>"default" : value of x is not replaced if it already is other than nil or false 

O código foo ||= bar é quase equivalente a foo = foo || bar foo = foo || bar . Em Ruby (como em muitas linguagens, como JavaScript ou Io), os operadores booleanos são operadores de “guarda”. Em vez de sempre retornar true ou false , eles avaliam o valor do primeiro operando que avalia um valor “truthy”.

Por exemplo, esse código foo = 1 || delete_all_files_from_my_computer() foo = 1 || delete_all_files_from_my_computer() não excluirá nada: foo será definido como 1 e o segundo operando nem será avaliado .

Em Ruby, os únicos valores “não-verdadeiros” são nil e false . Assim, o código foo ||= bar só irá avaliar bar e set foo para o resultado se foo for nil ou false .

Como as variables ​​de instância assumem o valor de nil quando não estão definidas, código como @foo ||= bar é um idioma Ruby comum para definir a variável de instância se ela ainda não tiver sido definida.

Você pode pensar nisso como curto para:

 @current_user = @current_user || User.find_by_id(session[:user_id]) 

@current_user é avaliado primeiro, se não for nulo, o OR retorna o valor de @current_user e não chama User.find_by_id.

    Intereting Posts