Действительно для проблем как они, лучшая вещь сделать ASKTOM. В особенности его ответ на тот вопрос содержит ссылки на документ Oracle онлайн, где много тех видов правил объяснено.
Одна вещь иметь в виду, это объясняет, что планы являются действительно лучшими предположениями.
Это была бы хорошая идея учиться использовать sqlplus и эксперимент с командой AUTOTRACE. С некоторыми твердыми числами можно обычно принимать лучшие решения.
, Но Вы должны ASKTOM. Он знает все об этом:)
Это делает мой класс менее гибким / удобным. Например: я не смог бы использовать
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
. Но, пожалуйста, не надо.
#coerce
. Итак, если вы хотите, чтобы пример 1 + a_status
работал, вам необходимо реализовать Status # coerce
. Но, пожалуйста, не надо. На самом деле Ruby использует протокол #coerce
. Итак, если вы хотите, чтобы пример 1 + a_status
работал, вам необходимо реализовать Status # coerce
. Но, пожалуйста, не делайте этого. Дух утиной печати определенно не заставил бы кого-то искать исходный код объекта 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.