2 votes

Ruby passe-t-il un ou plusieurs symboles comme argument(s) de mot-clé ?

J'ai une méthode dans laquelle je veux utiliser des paramètres de mots-clés et des instructions case/when, alors que je préférais utiliser des symboles :

  def navigate_to(page:)
    case page
    when :inbox
      # some code
    when :archive
      # some code
    else
      # some code
    end
  end

Est-ce la syntaxe correcte pour appeler la méthode ?

navigate_to page: :inbox

El : : semble un peu étrange.

4voto

Stefan Points 23363

La syntaxe de l'argument du mot-clé est :

key: value

Si la clé est page et la valeur est le symbole :inbox vous l'avez en effet fait :

page: :inbox

Vous pouvez également utiliser un argument positionnel à la place :

def navigate_to(page)
  # same as your code
end

navigate_to :inbox

1voto

berkes Points 9945

Oui, la syntaxe correcte est navigate_to page: :inbox .

Bien qu'il s'agisse d'un Ruby commun, il est court et équivalent pour plusieurs choses différentes. Tout d'abord, les accolades.

Vous êtes en train d'appeler :

navigate_to(page: :inbox)

Deuxièmement, le modèle d'argument par mot-clé provient des hachages comme arguments. Avant qu'il n'y ait des arguments de type mot-clé, une manière courante était de passer un hash[1], comme ceci :

def navigate_to(options)
  page = options[:page]
end
navigate_to({ page: :inbox })

Mais lorsque le dernier argument d'un appel de méthode est un hash, on peut laisser de côté l'élément {} .

Et enfin, les clés réelles dans le hachage. Il y a quelque temps (1.8 -> 1.9 IIRC), une version courte a été introduite pour les éléments suivants :

{ :page => 'Some Value' } à savoir { page: 'Some Value' } . Quand Some Value est un symbole, qui devient { page: :inbox } .

Donc, en prenant tout ça :

navigate_to page: :inbox

Originaire de :

navigate_to({ :page => :inbox })

Cela peut avoir plus de sens de le lire comme ça, ou de savoir que ça vient de là.

Et je sais que Ruby, ni les ruby-istes, n'aiment les bretelles, () Il n'est pas nécessaire de les ajouter, comme on peut le voir dans l'époustouflant DSL de rspec par exemple, mais je peux conseiller aux nouveaux développeurs de les ajouter. Cela rend souvent le code plus compréhensible.

navigate_to(page: :inbox) est probablement plus facile à comprendre que navigate_to page: :inbox surtout lorsque vous commencez à faire appel à d'autres méthodes : navigate_to page page_from_session :user .


[1] Mais, il faut le souligner, ce n'est pas vraiment ce qui se passe ici. Les arguments de mot-clé et les arguments de hachage diffèrent, maintenant que nous avons des arguments de mot-clé. Cela montre simplement pourquoi la syntaxe est de cette façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X