2012-03-09 23 views
5

Sé en Ruby, casi todo es una expresión. Incluso aquellos en otro idioma como if-else instrucción, case instrucción, declaración de asignación, declaración de bucle es una expresión en Ruby.¿Cuál es la diferencia de enunciado y expresión en Ruby?

Así que quiero saber desde el punto de vista de Ruby, ¿cuál es la diferencia entre enunciado y expresión?

+2

Como ha notado correctamente, no hay declaraciones en Ruby, por lo que la pregunta realmente no tiene sentido. –

Respuesta

4

No hay diferencia entre las expresiones y la declaración es Ruby. Todo se evalúa en un valor, por lo que todo es una expresión.

1

Piense en las expresiones como partes pequeñas de una oración. Piense en la declaración como esa oración completa o pensamiento. Una línea en su método o bucle podría ser una expresión, y el conglomerado de esas expresiones en un bucle cerrado o método podría considerarse una afirmación.

Esto es conceptualmente más o menos subjetivo. Como Niklas B. señaló correctamente (y usted notó correctamente).

¿Hay algún problema que esté tratando directamente que le haya hecho ver esto?

También escuchará a la gente decir que "todo en ruby ​​es un objeto" más que todo es una expresión.

+0

Diría que la principal diferencia conceptual es si el valor de algo se usa o se descarta. –

2

De Ruby hacking guide:

Además, la función y las definiciones de clase son típicamente declaraciones embargo en lenguajes como Lisp y Scheme, ya que todo es una expresión, que no tienen cuentas en el primer lugar. Ruby está cerca del diseño de Lisp en este sentido.

Estas son las reglas de gramática de la declaración, donde puede ver (más o menos) lo que es una declaración en la implementación del lenguaje. Observe la regla expr que significa que una stmnt podría ser una expr. Un expr no podría ser un stmt.

stmt  : kALIAS fitem fitem 
      | kALIAS tGVAR tGVAR 
      | kALIAS tGVAR tBACK_REF 
      | kALIAS tGVAR tNTH_REF 
      | kUNDEF undef_list 
      | stmt kIF_MOD expr_value 
      | stmt kUNLESS_MOD expr_value 
      | stmt kWHILE_MOD expr_value 
      | stmt kUNTIL_MOD expr_value 
      | stmt kRESCUE_MOD stmt 
      | klBEGIN ‘{’ compstmt ‘}’ 
      | klEND ‘{’ compstmt ‘}’ 
      | lhs ‘=’ command_call 
      | mlhs ‘=’ command_call 
      | var_lhs tOP_ASGN command_call 
      | primary_value ‘[’ aref_args ‘]’ tOP_ASGN command_call 
      | primary_value ‘.’ tIDENTIFIER tOP_ASGN command_call 
      | primary_value ‘.’ tCONSTANT tOP_ASGN command_call 
      | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call 
      | backref tOP_ASGN command_call 
      | lhs '=' mrhs_basic 
      | mlhs '=' mrhs 
      | expr 
Cuestiones relacionadas