2012-04-29 11 views

risposta

42

è nil in Ruby, non null. Ed è sufficiente dire if @objectname per verificare se non è zero. E no then. Potete trovare più if sintassi qui:

http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Control_Structures#if

+2

Sarebbe anche consigliabile giocare con 'rotaie console' per provare dichiarazioni sulla im fly – Jonathan

+0

avere questo uno se @ reviews.nil? allora e sempre è vero anche se c'è una recensione o no –

+0

non ci dovrebbe essere 'then' nel tuo' se'. Potreste anche voler spiegare un po 'di più su come compilate '@ reviews' (se è in effetti' .nil? 'Tutto il tempo) per darvi qualche altra idea. –

29

È possibile verificare se un oggetto è nullo (null) chiamando presente? o vuoto? .

@object.present? 

restituirà false se il progetto è una stringa vuota o nulla.

oppure è possibile utilizzare

@object.blank? 

questo è lo stesso come presente? con un botto e puoi usarlo se non ti piace 'a meno'. restituirà true per una stringa vuota o nulla.

+0

funziona ora grazie. ho usato il vuoto –

+0

'#blank?' e '#present?' hanno altre implicazioni rispetto al solo se l'oggetto è 'nil'. E 'quindi', mentre non comune, va bene in Ruby se le affermazioni. –

4

Nel tuo esempio, puoi semplicemente sostituire null con `nil e funzionerà correttamente.

require 'erb' 

template = <<EOS 
<% if (@objectname != nil) then %> 
    @objectname is not nil 
<% else %> 
    @objectname is nil 
<% end %> 
EOS 

@objectname = nil 
ERB.new(template, nil, '>').result # => " @objectname is nil\n" 

@objectname = 'some name' 
ERB.new(template, nil, '>').result # => " @objectname is not nil\n" 

Contrariamente a ciò che l'altro manifesto ha detto, si può vedere sopra che then funziona bene in Ruby. Non è comune, ma va bene.

#blank? e #present? hanno altre implicazioni. In particolare, se l'oggetto risponde a #empty?, controllerà se è vuoto. Se vai a http://api.rubyonrails.org/ e cerchi "vuoto?", Vedrai su quali oggetti è definito e come funziona. Guardando il definition on Object, vediamo "Un oggetto è vuoto se è falso, vuoto o una stringa di spaziatura.Ad esempio," "," ", nil, [] e {} sono tutti vuoti." Dovresti assicurarti che questo sia ciò che desideri.

Inoltre, nil è considerato falso, e qualsiasi cosa diversa da false e nil è considerata vera. Questo significa che è possibile inserire direttamente l'oggetto nella if, quindi un modo più canonica di scrivere quanto sopra sarebbe

require 'erb' 

template = <<EOS 
<% if @objectname %> 
    @objectname is not nil 
<% else %> 
    @objectname is nil 
<% end %> 
EOS 

@objectname = nil 
ERB.new(template, nil, '>').result # => " @objectname is nil\n" 

@objectname = 'some name' 
ERB.new(template, nil, '>').result # => " @objectname is not nil\n" 

Se è esplicitamente necessario controllare nil e non false, è possibile utilizzare il metodo #nil?, per quale nil è l'unico oggetto che farà sì che questo restituisca true.

nil.nil?   # => true 
false.nil?  # => false 
Object.new.nil? # => false 
7

Ora con Ruby 2.3 è possibile utilizzare &. operator ('operatore lonely') per verificare la presenza di nil allo stesso tempo, come l'accesso a un valore.

@person&.spouse&.name 

https://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Operators#Other_operators


Usa #try invece in modo non c'è bisogno di mantenere il controllo per nil.

http://api.rubyonrails.org/classes/Object.html#method-i-try

@person.try(:spouse).try(:name) 

invece di

@person.spouse.name if @person && @person.spouse 
Problemi correlati