Объявление параметра кортежа и причуда присвоения

Можно обнаружить его во времени выполнения с вышеупомянутым вызовом GetCurrentMethod. Но, это, казалось бы, было бы чем-то вроде отходов [1]. Самая легкая вещь сделать была бы только к ILDASM MSIL и проверка там.

Примечание, что это специально для компилятор встраивание вызова и покрыто различным Отражение документы о MSDN.

, Если метод, который называет метод GetCallingAssembly, расширен встроенный компилятором (то есть, если компилятор вставляет тело функции на испускаемый промежуточный язык Microsoft (MSIL), вместо того, чтобы испустить вызов функции), то блок, возвращенный методом GetCallingAssembly, является блоком, содержащим встроенный код. Это могло бы отличаться от блока, который содержит исходный метод. Чтобы гарантировать, что метод, который называет метод GetCallingAssembly, не встраивается компилятором, можно применить атрибут MethodImplAttribute с MethodImplOptions. NoInlining.

Однако Дрожание также свободно встроить вызовы - но я думаю, что дизассемблер был бы единственным способом проверить то, что и не сделано на том уровне.

Редактирование: Только для разрешения некоторого беспорядка в этом потоке csc.exe будет встроенные вызовы MSIL - хотя Дрожание (вероятно), будет более агрессивно в нем.

[1] И, отходами - я подразумеваю, что (a) это это побеждает цель встраивания (лучшая производительность) из-за Отражательного поиска. И (b), это, вероятно, изменило бы поведение встраивания так, чтобы это больше не встраивалось так или иначе. И, прежде чем Вы думаете, что можно просто повернуться, это на Отладке создает с Утверждением, или что-то - понимает, что не будет встроено во время Отладки, но может быть в Выпуске.

27
задан oxbow_lakes 26 October 2009 в 12:19
поделиться

1 ответ

Ну, я полагаю, потому что это было определено таким образом.

Это, присваивание кортежей, является примером сопоставления с образцом. Сопоставление с образцом происходит в трех местах, о которых я припоминаю:

var PATTERN = ... // or val

for (PATTERN <- ...) ...

case PATTERN => ...

Итак, все эти случаи работают:

val l = List((1,'a'), (2,'b'), (3,'c'))
var (n, c) = l(0)
for ((n, c) <- l) println(n+": "+c)
l(1) match {
  case (n, c) => println(n+": "+c)
}

Теперь рассмотрим последний пример, использующий case . Обратите внимание, что n и c в этом примере - это не то же самое n и c , определенные немного ранее. Сопоставление с шаблоном присвоит значения новым идентификаторам n и c , которые будут дублировать предыдущее определение для области действия оператора case . . То же самое произошло в примере для , который не изменил ранее определенные n и c .

Теперь, вы хотите, чтобы предыдущее значение было перезаписано, вместо того, чтобы назначать новые значения новым идентификаторам. Это не то, как работает сопоставление с образцом, а это значит, что для его реализации потребуется совершенно новое правило. Поскольку Scala мягко подталкивает людей к неизменности, я полагаю, что было бы разумно не создать новое правило только для решения этой проблемы.

27
ответ дан 28 November 2019 в 05:45
поделиться
Другие вопросы по тегам:

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