Lorsque le chargement des fichiers, je l'habitude de faire une variante de:alternative à court de ternaire et de sauvetage sous forme de modification
first_file = "#{__dir__}/first_file.txt"
first_data = File.exist?(first_file) ? File.readlines(first_file) : []
second_file = "#{__dir__}/second_file.yaml"
second_data = File.exist?(second_file) ? YAML.load_file(second_file) : {}
qui a toujours assis un peu de mal avec moi. Ayant besoin de la vérification pour voir si le fichier existe est quelque chose que a besoin de pour être là, mais ce qui m'importe vraiment est ce qui vient après.
Finalement, j'ai découvert en ligne rescue
, et a commencé à le faire comme ceci:
first_file = "#{__dir__}/first_file.txt"
first_data = File.readlines(firs_file) rescue []
second_file = "#{__dir__}/second_file.yaml"
second_data = YAML.load_file(second_file) rescue {}
Ce me est beaucoup plus claire - essayer de cette chose que vous voulez vraiment, et si vous ne pouvez pas faire autre chose que est exactement le repli que vous voulez. C'est à la fois plus court et plus clair que le ternaire.
Mais partout où je regarde le même conseil à avoid rescue
in modifier form est répété. Je comprends pourquoi: cela peut cacher des erreurs que nous ne prévoyions pas.
Si je pouvais définir Errno::ENOENT
comme l'erreur à rescue
à partir de la forme en ligne, je le ferais. Mais autant que je peux dire, en ligne rescue
ne peut pas spécifier de quelle erreur à sauver.
Alors, quelle est l'alternative? Que puis-je faire qui est aussi court et clair que le rescue
en ligne, mais sans l'inconvénient?
Revenez à votre ancienne façon. – sawa
Je suis d'accord avec Sergio, les doublures intelligentes ne sont pas si lisible de nombreuses fois. Créez simplement des méthodes d'aide. –
Je pense que j'ai été clair pourquoi je ne veux pas revenir à l'ancienne. Si le seul argument est de "revenir à l'ancienne", il vaut mieux s'en tenir au nouveau. – user137369