Я думаю, что это не так легко проблема. Мы можем сказать, что застреваем с JS, но он действительно настолько плохо с jQuery, Прототипом, scriptaculous, MooTools и всеми фантастическими библиотеками?
Помнят, JS легкий вес , еще больше с V8, TraceMonkey, SquirrelFish - новые механизмы JavaScript, используемые в современных браузерах.
Это также , доказал - да, мы знаем, что это имеет проблемы, но у нас есть многие из них, в которых разбираются, как ранние проблемы безопасности. Обработка изображений разрешения браузера выполнить код Ruby или что-либо еще. Тестовая среда безопасности должна была бы быть сделана для царапины. И Вы знаете что? Люди Python уже перестали работать два раза в нем.
я думаю, что JavaScript будет пересмотренным и улучшался со временем, точно так же, как HTML и CSS. Процесс может быть долгим, но не все возможно в этом мире.
Вы можете использовать Границы просмотра .
Короче говоря, def foo [T <% U] (t: T)
- это функция который будет принимать любой T, который либо является, либо может быть неявно преобразован в U. Поскольку Int может быть преобразован в RichInt (который содержит ваш желаемый метод), это отличный пример использования.
class MaxOfList[T <% Ordered[T]](list: List[T] ) {
def max = {
val seed: Option[T] = None
list.foldLeft(seed)(getMax(_,_))
}
private def getMax(xOption: Option[T], y: T) = (xOption, y) match {
case (Some(x), y) if ( x > y ) => xOption
case (_, y) => Some(y)
}
}
PS - Я переписал ваш getMax (...) для сравнения значений вместо самих параметров и использовал сопоставление с образцом вместо isDefined (...)
PPS - Scala 2.8 будет иметь черту Numeric, которая может оказаться полезной. http://article.gmane.org/gmane.comp.lang.scala/16608
Addendum
Просто для смеха, вот сверхкомпактная версия, которая полностью исключает метод getMax:
class MaxOfList[T <% Ordered[T]](list: List[T] ) {
def max = list.foldLeft(None: Option[T]) {
case (Some(x), y) if ( x > y ) => Some(x)
case (_, y) => Some(y)
}
}
Тем не менее Другое приложение
Эта версия была бы более эффективной для больших списков ... позволяет избежать создания Some (x) для каждого элемента:
class MaxOfList[T <% Ordered[T]](list: List[T] ) {
def max = {
if (list.isEmpty) None
else Some(list.reduceLeft((a,b) => if (a > b) a else b))
}
}
Последний, я обещаю!
На этом этапе вы можете просто отказаться от класса и использовать функцию:
def max[T <% Ordered[T]](i: Iterable[T]) = {
if (i.isEmpty) None
else Some(i.reduceLeft((a,b) => if (a > b) a else b))
}
С Numeric [T]
в scala 2.8,
scala> case class MaxOfList[T : Numeric](list: List[T]) {
| def max = if(list.isEmpty) None else Some(list.max)
| }
defined class MaxOfList
scala> MaxOfList(1::2::3::9::7::Nil).max
res1: Option[Int] = Some(9)
scala> MaxOfList(1.5::3.9::9.2::4.5::Nil).max
res2: Option[Double] = Some(9.2)
scala> MaxOfList(Nil: List[Byte]).max
res3: Option[Byte] = None
scala>
Как ответил Митч Блевинс , это то, для чего были сделаны границы просмотра . Теперь, хотя Numeric
добавлен только в Scala 2.8, это не значит, что он не зависит от каких-либо функций Scala 2.8. То же самое можно было бы сделать в Scala 2.7.
Возможно, вас заинтересуют некоторые общие фрагменты кода, которые я написал для Rosetta Code :