2010-05-15 6 views
7

Ok, donc je comparais quelques trucs dans mon propre DSL à Ruby. Une construction à la fois le soutien est qu'ils ceCréation de hachage implicite incohérente dans Ruby?

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

Connaître la différence entre les tableaux et les hash, je pense que cela est illégal, mais le résultat en Ruby est

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

Pourquoi est-ce? Et avec cette syntaxe un peu pourquoi ne pouvez pas vous faire

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

Pourquoi un tableau un cas particulier pour hash implicitement créé?

Répondre

2

Un autre cas particulier est dans un appel de fonction, pensez à:

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

Ainsi, dans certains contextes, Hashes peut être construit implicitement (en détectant l'opérateur =>?). Je suppose que la réponse est juste que c'était le comportement le moins surprenant de Matz.

+0

wow c'est très étrange .. – Earlz

+0

Ceci est la réponse la plus proche. C'est juste une partie de la syntaxe. Chattu certains dans #RubyOnRails pour découvrir qu'il fait partie de la grammaire Ruby. – Earlz

0

Je dirais que l'interpréteur se rend compte que "clé" => "valeur" est un hachage, de la même façon que 5 est un nombre lorsque vous le mettez dans un tableau.
Donc, si vous écrivez:

x = [5] 

L'interprète ne va pas penser qu'il est une chaîne, et retour:

x = ["5"] 

Il semble que Ruby crée implicitement hash dans certains cas.

+0

oui, mais 'x = (5)' et 'x = (" 5 ")' sont tous valides (les parenthèses ont juste été mises en désambiguïsation possible) alors pourquoi pas 'x = (" key "=>" value ")' Pourquoi pouvez-vous mettre cela dans un tableau, mais pas directement dans une variable? – Earlz

+0

@Earlz - vous ne pouvez pas mettre cela directement dans une variable car ce n'est pas comme une chaîne ou un nombre de cette façon. Il montre une association entre 2 éléments dans un hachage. Il semble que lorsque vous l'initialisez dans un tableau, il le convertit en un hachage, mais lorsque vous essayez de le mettre dans une variable, il n'est pas – bennybdbc

2

Avec cette apparente incohérence dans la création de hachage implicite, ruby ​​réalise la cohérence à cet égard:

func(whatever...) 

peut toujours être substitué par:

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

Vous pouvez convertir entre les listes d'arguments et les tableaux, et il est donc logique qu'ils aient la même syntaxe.

Questions connexes