Являются ли операторы списка ::: и ++ одинаковыми или они различны? [Дубликат]

Можно определить почти все функции mysql_ *, используя mysqli или PDO. Просто включите их поверх своего старого PHP-приложения, и он будет работать на PHP7. Мое решение здесь .

length : false;
}

function mysql_field_name($qlink, $offset) {
    $field = mysqli_fetch_field_direct($qlink, $offset);
    if (!is_object($field))
        return false;
    return empty($field->orgname) ? $field->name : $field->orgname;
}

function mysql_field_table($qlink, $offset) {
    $field = mysqli_fetch_field_direct($qlink, $offset);
    if (!is_object($field))
        return false;
    return empty($field->orgtable) ? $field->table : $field->orgtable;
}

function mysql_field_type($qlink, $offset) {
    $field = mysqli_fetch_field_direct($qlink, $offset);
    return is_object($field) ? $field->type : false;
}

function mysql_free_result($qlink) {
    try {
        mysqli_free_result($qlink);
    } catch (Exception $e) {
        return false;
    }
    return true;
}

306
задан Jacek Laskowski 1 May 2013 в 09:24
поделиться

4 ответа

Наследие. Список изначально был определен как функционально-язычный:

1 :: 2 :: Nil // a list
list1 ::: list2  // concatenation of two lists

list match {
  case head :: tail => "non-empty"
  case Nil          => "empty"
}

Конечно, Scala разработала другие коллекции специальным образом. Когда вышел 2.8, коллекции были переработаны для максимального повторного использования кода и согласованного API, так что вы можете использовать ++ для объединения любых двух коллекций и даже итераторов. Однако список должен содержать своих первоначальных операторов, кроме одного или двух, которые устарели.

269
ответ дан Zoltán 26 August 2018 в 18:31
поделиться

Другая точка состоит в том, что первое предложение анализируется как:

scala> List(1,2,3).++(List(4,5))
res0: List[Int] = List(1, 2, 3, 4, 5)

. В то время как второй пример анализируется как:

scala> List(4,5).:::(List(1,2,3))
res1: List[Int] = List(1, 2, 3, 4, 5)

Итак, если вы используете макросы, вы должны позаботиться.

Кроме того, ++ для двух списков вызывает :::, но с большим количеством служебных данных, потому что он просит неявное значение иметь построитель из списка в список. Но микробенчмарки не показали ничего полезного в этом смысле, я думаю, что компилятор оптимизирует такие вызовы.

Micro-Benchmarks после разогрева.

scala>def time(a: => Unit): Long = { val t = System.currentTimeMillis; a; System.currentTimeMillis - t}
scala>def average(a: () => Long) = (for(i<-1 to 100) yield a()).sum/100

scala>average (() => time { (List[Int]() /: (1 to 1000)) { case (l, e) => l ++ List(e) } })
res1: Long = 46
scala>average (() => time { (List[Int]() /: (1 to 1000)) { case (l, e) => l ::: List(e ) } })
res2: Long = 46

Как сказал Дэниел С. Собрай , вы можете добавить содержимое любой коллекции в список, используя ++, тогда как с ::: вы можете только конкатенировать списки.

18
ответ дан C8H10N4O2 26 August 2018 в 18:31
поделиться

::: работает только со списками, а ++ может использоваться с любым проходящим. В текущей реализации (2.9.0) ++ возвращается на :::, если аргумент также является List.

73
ответ дан paradigmatic 26 August 2018 в 18:31
поделиться

Всегда используйте :::. Существует две причины: эффективность и безопасность типов.

Эффективность

x ::: y ::: z быстрее, чем x ++ y ++ z, поскольку ::: является правильной ассоциативной. x ::: y ::: z анализируется как x ::: (y ::: z), который алгоритмически быстрее, чем (x ::: y) ::: z (последний требует O (| x |) дополнительных шагов).

Тип безопасности

С ::: вы можете конкатенировать только два List s. С помощью ++ вы можете добавить любую коллекцию в List, что ужасно:

scala> List(1, 2, 3) ++ "ab"
res0: List[AnyVal] = List(1, 2, 3, a, b)

++ также легко смешивается с +:

scala> List(1, 2, 3) + "ab"
res1: String = List(1, 2, 3)ab
64
ответ дан ZhekaKozlov 26 August 2018 в 18:31
поделиться
Другие вопросы по тегам:

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