Как работает «20 секунд» в Scala?

Как следующая компиляция:

import scala.concurrent.duration._

val time = 20 seconds

Что на самом деле здесь происходит?

113 голосов | спросил ripper234 27 FebruaryEurope/MoscowbWed, 27 Feb 2013 08:58:35 +0400000000amWed, 27 Feb 2013 08:58:35 +040013 2013, 08:58:35

2 ответа


0

Есть несколько вещей, происходящих.

Во-первых, Scala позволяет не использовать точки и символы скобок во многих вызовах методов, поэтому 20 seconds эквивалентно 20.seconds() *

Во-вторых, применяется "неявное преобразование". Поскольку 20 является Int и Int не имеет метода seconds, компилятор ищет неявное преобразование, которое принимает Int и возвращает что-то, что имеет a seconds, причем поиск ограничен областью применения вашего метода.

Вы импортировали DurationInt в твои рамки. Поскольку DurationInt является неявным классом с IntПараметр>, его конструктор определяет неявное преобразование Int => DurationInt. DurationInt имеет метод seconds, поэтому удовлетворяет всем критериям поиска. Поэтому компилятор переписывает ваш вызов как new DurationInt(20).seconds **.

* Я имею в виду это свободно. 20.seconds() на самом деле недопустим, потому что метод seconds не имеет списка параметров, и поэтому при вызове метода должны быть опущены символы должны .

** На самом деле это не совсем так, потому что DurationInt является классом значений, поэтому компилятор избежит переноса целого числа, если возможный.

ответил Aaron Novstrup 27 FebruaryEurope/MoscowbWed, 27 Feb 2013 09:22:53 +0400000000amWed, 27 Feb 2013 09:22:53 +040013 2013, 09:22:53
0

«Волшебство», которое там происходит, называется «неявное преобразование». Вы импортируете неявные преобразования, и некоторые из них обрабатывают преобразование между Int (и Double) в Duration. Вот с чем ты имеешь дело.

ответил Bruno Reis 27 FebruaryEurope/MoscowbWed, 27 Feb 2013 09:07:13 +0400000000amWed, 27 Feb 2013 09:07:13 +040013 2013, 09:07:13

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132