2010-05-15 19 views
7

Ok, entonces estaba comparando algunas cosas en mi propia DSL con Ruby. Una construcción que ambos apoyan esta esCreación de hash implícita inconsistente en Ruby?

x=["key" => "value"] 

Saber la diferencia entre arrays y hashes, yo creo que esto es ilegal, pero el resultado en Ruby es

[{"key" => "value"}] 

¿Por qué es esto? Y con esta sintaxis un poco por qué no se puede hacer

x=("key" => "value") 

¿Por qué es una matriz un caso especial para los hashes creados implícitamente?

Respuesta

2

Otro caso especial es en una llamada de función, tenga en cuenta:

def f(x) 
    puts "OK: #{x.inspect}" 
end 
f("foo" => "bar") 
=> OK: {"foo"=>"bar"} 

Así, en algunos contextos, hashes se pueden construir de forma implícita (mediante la detección del operador =>?). Supongo que la respuesta es que este fue el comportamiento menos sorprendente de Matz.

+0

wow eso es muy extraño ... – Earlz

+0

Esta es la respuesta más cercana. Es solo parte de la sintaxis. Conversó con algunos en #RubyOnRails para descubrir que es parte de la gramática de Ruby. – Earlz

0

Yo diría que el intérprete se da cuenta de que "clave" => "valor" es un hash, de la misma manera que se daría cuenta de que 5 es un número cuando lo pone en una matriz.
Así que si usted escribe:

x = [5] 

El intérprete no va a pensar que es una cadena, y regreso:

x = ["5"] 

Parece que el rubí crea implícitamente hashes en algunos casos.

+0

sí, pero 'x = (5)' y 'x = (" 5 ")' son todos válidos (los paréntesis se pusieron como posibles desambiguación) ¿por qué no 'x = (" clave "=>" value ")' ¿Por qué puedes poner esto en una matriz pero no directamente en una variable? – Earlz

+0

@Earlz - no puede poner eso directamente en una variable ya que no es como una cadena o número de esa manera. Muestra una asociación entre 2 elementos en un hash. Parece que cuando lo inicias en una matriz, lo convierte en un hash, pero cuando tratas de ponerlo en una variable no es – bennybdbc

2

Con esta aparente inconsistencia en la creación de hash implícita, rubí logra coherencia a este respecto:

func(whatever...) 

siempre puede ser sustituido con:

args = [whatever...] 
func(*args) 

Puede convertir entre listas de argumentos y matrices, y por lo tanto, es lógico que tengan la misma sintaxis.