||=-operatorn i Ruby

I Ruby, liksom de flesta andra programmeringsspråk, finns det något som kallas abbreviated assignment (förkortad tilldelning). Det är operatorer som += och -= som låter oss lägga till respektive dra ifrån värdet på en redan existerande variabel.

Om man är ny i Ruby-världen finns det risk för förvirring när man stöter på ||= i andras källkod. Vad gör den och vad är den bra till? Jag tänkte förklara med ett exempel.

puts @count
#=> nil

@count ||= 0
puts @count #=> 0

Okej, vad händer här egentligen? Vi börjar med en instansvariabel @count som är odefinierad (nil). Sedan använder vi ||=-operatorn och @count är nu 0. Har vi bara gjort en vanlig tilldelning?

@count ||= 32
puts @count #=> 0

Det verkar inte så, efter en ny tilldelning är @count fortfarande 0. ||= är egentligen bara en förkortning och kan skrivas om:

@count = @count || 32

||-operatorn i Ruby fungerar så här: först undersöks operanden till vänster. Om den har ett värde som inte är nil eller false så returneras det värdet. Annars returneras värdet på operanden till höger.

Så om vi ska översätta den senaste raden kod till "ren svenska": sätt variabeln @count till 32 om @count inte redan har något värde.

När har jag användning för detta?

Säg till exempel att du har har en metod i en webbapplikation som hämtar den inloggade användaren från databasen. För att undvika onödiga anrop till databasen väljer du att spara undan användaren i en instansvariabel. Koden för detta ser ut så här:

def current_user
  return @current_user unless @current_user.nil?
  @current_user = User.find(session[:user_id])
end
Det här är ett perfekt användningsområde för   =-operatorn. Du kan spara en hel rad genom att i stället skriva så här:
def current_user
  @current_user ||= User.find(session[:user_id])
end

Uppdaterat 2011-11-24: Tack till Linh som fick mig att uppdatera med ett bättre exempel.