Возможно причина, что C# не делает простым включить тип, состоит в том, потому что это - прежде всего, объектно-ориентированный язык и 'корректный' способ сделать, это в объектно-ориентированных терминах должно было бы определить метод GetRentPrice на Механизме и переопределить его в производных классах.
Однако я провел немного времени, играя с мультипарадигмой и функциональными языками как F# и Haskell, которые имеют этот тип возможности, и я столкнулся со многими местами, где это было бы полезно прежде (например, когда Вы не пишете типы, необходимо включить так, Вы не можете реализовать виртуальный метод на них), и это - что-то, что я принял бы в язык наряду с дизъюнктными объединениями.
[Редактирование: Удаленная часть о представлении в качестве Marc указала, что это могло быть закорочено]
, Другой потенциальной проблемой является удобство использования одно - ясно из заключительного вызова, что происходит, если соответствию не удается удовлетворить каким-либо условиям, но каково поведение, если это соответствует двум или больше условиям? Это должно выдать исключение? Это должно возвратить первое или последнее соответствие?
А путем я склонен использовать для решения этого вида проблемы, должен использовать поле словаря с типом как ключ и лямбда как значение, которое является довольно кратким для построения синтаксиса инициализатора объекта использования; однако, это только составляет конкретный тип и не позволяет дополнительные предикаты, так может не подойти для более сложных случаев. [Примечание стороны - при рассмотрении вывода компилятора C# это часто преобразовывает операторы переключения в основанные на словаре таблицы переходов, таким образом, кажется, нет серьезного основания, это не могло поддерживать включение типов]
I не верю, что validates_length_of
поддерживает динамические параметры. Вам нужно будет продублировать поведение в настраиваемой проверке.
# in model
def validate
unless (5..10).member? name.length
errors.add :name, "must be within 5 to 10 characters"
end
end
Здесь используется статический диапазон, но вы можете легко использовать свою собственную переменную настраиваемого диапазона.
def validate
unless some_range.member? name.length
errors.add :name, "must be within #{some_range.first} to #{some_range.last} characters"
end
end
Вы можете проверить мой эпизод Railscasts по условию проверки и Эпизод 3 в моей Ежедневной серии Active Record .