Последствия реализации to_int и to_str в Ruby

Действительно для проблем как они, лучшая вещь сделать ASKTOM. В особенности его ответ на тот вопрос содержит ссылки на документ Oracle онлайн, где много тех видов правил объяснено.

Одна вещь иметь в виду, это объясняет, что планы являются действительно лучшими предположениями.

Это была бы хорошая идея учиться использовать sqlplus и эксперимент с командой AUTOTRACE. С некоторыми твердыми числами можно обычно принимать лучшие решения.

, Но Вы должны ASKTOM. Он знает все об этом:)

5
задан Anthony 2 January 2015 в 19:04
поделиться

2 ответа

Это делает мой класс менее гибким / удобным. Например: я не смог бы использовать String # + для объединения вывода Status с другой строкой, если бы у меня не было Status # to_str .

Это плохой пример , потому что конкатенация строк - это унидиоматический Ruby. Интерполяция строк является предпочтительным способом:

a_string = "Output was: #{results}"

И этот просто работает ™, потому что интерполяция строк фактически вызывает to_s для результата интерполированного выражения.

Похоже, это нарушает дух утиной печати. Пользователь объекта (т.е. метода, который получает его в качестве параметра) не должен заботиться о том, что это за объект , его должно заботить только то, что он может делать . (В этом случае «do» означает «может быть представлено как строка / int».)

Я бы сказал, что «

Аргументы в пользу «по сути своей является строкой / целым числом» для меня довольно расплывчаты. Например, вы увидите, что Float # to_int упоминается часто. История гласит, что, поскольку число с плавающей запятой всегда имеет целочисленный компонент, to_int является допустимым методом. Однако я думаю, что это ложно: Float не целое число (поскольку он имеет нецелочисленный компонент), и поэтому попытки приравнять их «типичность» не имеют большого смысла. Вы можете законно преобразовать Float в целое число (посредством усечения), но тогда я могу сказать, что могу преобразовать свой статус в целое число (путем «усечения» всех информация о коде выхода).

Опять же, это довольно слабый аргумент, потому что я действительно согласен с вами: это неверно.

В немецком законодательстве, у нас есть принцип, который трудно понять и который не является инициативами, но который, я думаю, здесь прекрасно применим. Он называется «Keine Gleichheit im Unrecht» («Нет равенства в неправоте»). Это означает, что основное право Равенства, закрепленное в Конституции, применяется только в рамках Закона. Другими словами: OJ не делает убийство законным.

Итак, просто потому, что в основной библиотеке Ruby есть дерьмовый код (и поверьте мне, есть лот ), это не значит значит, вы тоже можете писать чушь: -)

В данном конкретном случае Float # to_int просто неверно и не должно существовать. Число с плавающей запятой не является подтипом Integer . На первый взгляд кажется, что все наоборот, т.е. Integer # to_float действительно, но на самом деле это тоже не так: в Ruby Integer имеют произвольную точность, а Float имеют фиксированную точность. было бы допустимо для реализации Fixnum # to_float , но это было бы плохой идеей, поскольку Integer s можно волшебным образом преобразовать из Fixnum to BigInteger и обратно, и, таким образом, метод #to_float «волшебным образом» появится и исчезнет.

То, что наконец помогло мне понять разницу между to_x и to_xyz was Array # join : выводит элементы массива, разделенные объектом-разделителем. Для этого он вызывает to_s для каждого элемента массива и to_str для разделителя. Как только вы поймете , почему он вызывает to_s на одном и to_str на другом, вы в основном настроены.

(Хотя ваши комментарии к Float # to_int уже указывает, что вы понимаете .)


Примечание: для двойной отправки в алгебраическом контексте Ruby фактически использует протокол #coerce . Итак, если вы хотите, чтобы пример 1 + a_status работал, вам необходимо реализовать Status # coerce . Но, пожалуйста, не надо.

На самом деле Ruby использует протокол #coerce . Итак, если вы хотите, чтобы пример 1 + a_status работал, вам необходимо реализовать Status # coerce . Но, пожалуйста, не надо.

На самом деле Ruby использует протокол #coerce . Итак, если вы хотите, чтобы пример 1 + a_status работал, вам необходимо реализовать Status # coerce . Но, пожалуйста, не делайте этого.

8
ответ дан 13 December 2019 в 05:37
поделиться

Дух утиной печати определенно не заставил бы кого-то искать исходный код объекта Status, чтобы выяснить, что возвращается.

Лично я считаю, что вам следует раскрыть текстовые результаты и выход status с помощью двух методов экземпляра:

class Status

  ...

  def message
    @output
  end

  def exit_status
    @status.exitstatus
  end

end

И затем используйте его следующим образом

a_string = "Output was: " + results.message
a_int    = 1 + results.exit_status

Что сразу имеет смысл для любого, кто читает код, IMHO.

4
ответ дан 13 December 2019 в 05:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: