Почему не хватает NilClass # to_hash? - PullRequest
1 голос
/ 01 апреля 2011

Различные методы, определенные в NilClass, удобны, чтобы избежать ошибок Method undefined on NilClass и освобождают вас от использования try, oror, andand, ||, && в различных случаях:

  • to_a для многомерного массива, когда для некоторых индексов могут отсутствовать некоторые значения:

    array [i] .to_a [j].to_a [k]

  • to_s сопоставление с шаблоном, которое может завершиться ошибкой:

    string [regex] .to_s * 2

  • to_i, to_f, to_c для поиска по индексу, который может завершиться неудачей и т. Д .:

    array.index (element).to_i * 3

Но нет NilClass#to_hash, хотя есть Hash#to_hash.

Если такой метод существовал (class NilClass; def to_hash; {} end end), то мысможет сделать:

  • to_hash для нескольких встроенных хэшей, когда для некоторых ключей может не быть значений:

    hash [: a] .to_hash[: b] .to_hash [: c]

Лучшая альтернатива, которую я могу придумать:

hash.fetch(:a, {}).fetch(:b, {})[:c]

но было бы неплохо, если бы у нас было NilClass#to_hash.Почему его не хватает?

Ответы [ 3 ]

1 голос
/ 01 апреля 2011

Это хороший момент, и в Ruby вы всегда можете добавить такой метод в nil, а библиотеки в Rails выполняют довольно много подобного типа.Лично я стараюсь не делать этого, потому что изменение поведения широко используемого класса может привести к непредвиденным побочным эффектам в других библиотеках.Если патч выполняется популярным фреймворком, это нормально, потому что другие библиотеки должны были быть протестированы с этим, но делать это невольно, это совсем другое дело.существовать к настоящему времени, если это решит болевую точку, которую чувствовали многие люди.Синтаксис try больше не является и не слишком ужасным.

hash.try(:[],a).try(:[],b).try(:[],c)
0 голосов
/ 18 октября 2014

Меня также заинтересовал бы метод NilClass#to_hash.

Вот ответ Матца:

to_a и т. Д. Являются явными методами преобразования, тогда как to_int, to_hashи т. д. являются неявными методами преобразования.Я не вижу веских оснований для добавления неявных методов преобразования к nil.

Вот вопрос от Tsuyoshi Sawada:

Различные методы, определенные в NilClassудобно, чтобы метод не был определен при ошибках NilClass.Например,

  • to_a для многомерного массива, когда для некоторых индексов могут отсутствовать значения:

array [i] .to_a [j] .to_a[k]

  • to_s для сопоставления с шаблоном, который может завершиться неудачей:

string [regex] .to_s * 2

  • to_i, to_f, to_c для поиска по индексу, который может завершиться неудачей и т. Д .:

array.index (element) .to_i * 3

Но NilClass#to_hash нетхотя есть Hash#to_hash.Если бы такой метод существовал (эквивалент class NilClass; def to_hash; {} end end), то мы могли бы сделать:

  • to_hash для нескольких встроенных хэшей, когда для некоторых ключей может не быть значений:

hash [: a] .to_hash [: b] .to_hash [: c]

Есть ли причина, по которой to_a, to_s, to_i, to_f,to_c все определены для NilClass, но не для to_hash?Если нет, я хотел бы запросить эту функцию.

Источник

0 голосов
/ 01 мая 2011

Отредактированный

Я отправил запрос о NilClass#to_hash в ruby ​​development. Мац отклонил это в ближайшее время. Андрей сообщил мне в комментарии ниже, что Матц дал комментарий к нему. Ответ на этот вопрос, таким образом, дан мой Matz, и вы можете увидеть это, перейдя по ссылке Эндрю ниже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...