Perché l'assegnazione di una variabile a false restituisce false?

3

Perché:

something = false

restituisci sempre falso?

Poiché si tratta di un compito e non di un confronto, sembra più sensato restituire il risultato (successo / fallimento) del compito ( come quasi ogni altro compito che fai ).

EDIT - questo è sbagliato, come indicano le risposte sottostanti. Colpa mia. Leggera scoreggia cerebrale. Guarda l'impeto originale per questa domanda nei commenti qui sotto.

Che cosa succede se some_boolean_var = false fallisce per qualsiasi ragione (improbabile, ma teoricamente possibile, specialmente se hai definito un metodo personalizzato per questa azione)? Ciò restituirebbe anche false, quindi non hai alcuna indicazione sul fatto che il compito abbia effettivamente funzionato.

Fondamentalmente significa semplicemente che non puoi combinare compito e confronto in una riga come puoi fare con quasi tutto il resto in Rails. Ad esempio, non puoi fare:

if something = false (note the single =)
  do stuff
end

Voglio dire che puoi farlo ma non se vuoi controllare e assicurarti che l'assegnazione sia andata a buon fine.

È davvero strano per me.

Sono sicuro che c'è una ragione per questo quindi per favore chiariscimi:)

Grazie in anticipo!

    
posta bcb 12.10.2013 - 21:06
fonte

2 risposte

8

In ruby (e possono lingue che tracciano una parvenza di un lignaggio in C), l'operatore = restituisce tradizionalmente il valore che è stato assegnato.

>> foo = false
=> false
>> foo = 4
=> 4

Ciò consente di utilizzare ciò che è noto come assegnazione concatenata (vedi domanda correlata su P.SE ) per fare cose come:

>> foo = bar = 42
=> 42
>> foo
=> 42
>> bar
=> 42

In questo esempio, viene analizzato come foo = (bar = 42) . Da questo, bar = 42 restituisce 42 , che viene quindi assegnato a foo .

Questo tipo di struttura si trova in C, C ++, Java, Perl e in molti altri linguaggi.

Consideralo in questo modo - ogni operatore restituisce qualcosa - quale altro valore restituirebbe = rispetto al valore assegnato?

Sebbene non permetta il tuo test if something = false , consente strutture che possono essere ripristinate:

while data = file.getc
    ...
end

In Ruby getc restituisce il carattere read (e un nil (un valore falsey) quando il file è stato letto completamente). Pertanto, il test condizionale di lettura e ciclo sono eseguiti all'interno del ciclo stesso.

    
risposta data 12.10.2013 - 21:22
fonte
0

L'attribuzione valuta il valore assegnato, che può essere utile per alcune scorciatoie, ad esempio:

if x = get_some_value()
  puts "x is #{x}"
else
  puts "no x"
end
    
risposta data 12.10.2013 - 21:22
fonte

Leggi altre domande sui tag