2016-12-22 3 views
0

Je suis en train de concevoir un api qui fonctionne comme ceci:Comment est-ce que j'écris une méthode de ruby ​​combinant des arguments de mot-clé avec le hachage?

client.entries(content_type: 'shirts', { some: 'query', other: 'more', limit: 5 }) 

J'ai donc cette méthode dans ma client classe:

def entries(content_type:, query={}) 
    puts query 
end 

Mais je reçois syntax error, unexpected tIDENTIFIER

J'ai aussi essayé splatting :

def entries(content_type:, **query) 
    puts query 
end 

Mais je reçois

syntax error, unexpected ')', expecting =>...ry', other: 'more', limit: 5 }) 

Quelle est la bonne façon de procéder sans changer l'ordre des arguments. Le second argument doit être un hachage et je ne veux pas utiliser un keyword argument comme second paramètre

Répondre

1

La deuxième travaux en IRM en cours et JRuby:

def entries(content_type:, **query) 
    puts query 
end 
entries(content_type: 3, baz: 4) 
# => {:baz=>4} 

Le premier ne peut pas fonctionner parce que Vous ne pouvez pas avoir d'argument mot-clé et collecter automatiquement des paires clé-valeur dans un argument de hachage.

EDIT en réponse au commentaire:

Si vous voulez passer un hachage et ne pas collecter des mots-clés supplémentaires dans un hachage, alors vous devez inverser la signature:

def entries(query={}, content_type:) 
    puts query 
end 
entries(content_type: 3) 
# => {} 
entries({ baz: 4 }, content_type: 3) 
# => {:baz=>4} 

Ou, vous pouvez splat votre hachage:

def entries(content_type:, **query) 
    puts query 
end 
entries(content_type: 3, **{baz: 4}) 
# => {:baz=>4} 

Ou, vous pouvez faire le second argument aussi en un mot clé:

def entries(content_type:, query: {}) 
    puts query 
end 
entries(content_type: 3) 
# => {} 
entries(content_type: 3, query: {baz: 4}) 
# => {:baz=>4} 
+0

ouais assez proche mais ne correspond pas exactement à l'API que je veux. Je veux à l'utilisateur de passer dans un hachage explicite –

+0

nope - ne peut pas faire cela. Sans le premier argument, le second est sans signification –

+0

l'hachage dans un appel de méthode - wow ne le savait pas! Mais c'est trop demander à un utilisateur api. Je pense que je vais refaire l'appel –