Я только что открыл для себя Haxe сегодня вечером и был приятно удивлен тем, насколько удобен синтаксис для разработчиков. Быстро понятно, настоящая радость, что он близок к ECMAScript.
.
└── src/
├── http/
│ ├── Router.hx
│ └── Route.hx
└── Main.hx
У меня есть класс Router, который объявляет метод addGetRoute с необязательным вторым параметром:
package http;
import http.Route;
class Router
{
var routes: Array<Route>;
public function new()
{
this.routes = [];
}
public function addGetRoute(route: String, ?handler: () -> String): Void
{
this.routes.push(new Route(route, handler));
}
}
Это содержимое класса Route:
package http;
class Route
{
var route: String;
var handler: () -> String;
public function new(route: String, handler: () -> String)
{
this.route = route;
this.handler = handler;
}
}
Что я не понимаю, так это то, что компилятор не выдает ошибку, увидев этот код:
this.routes.push(new Route(route, handler));
Я ожидаю, что он выдаст ошибку, поскольку второй параметр может быть нулевым.
Я что-то пропустил?
По умолчанию все, кроме базовых типов (Int
, Float
, Bool
), обнуляемы в Haxe, включая ссылки на функции (и даже базовые типы обнуляемы на динамических целях). При добавлении ?
к аргументу тип оборачивается в Null<T> , но это не имеет никакого эффекта, если тип уже допускает значение null. Основная причина сделать аргумент «необязательным» с ?
заключается в том, что он подразумевает = null
значение по умолчанию, что позволяет пропустить его на месте вызова.
Начиная с Haxe 4, на самом деле существует опциональная функция нулевой безопасности, которая обеспечивает, что только Null<T>
может принимать значение NULL, и, таким образом, выдает желаемую ошибку компилятора:
@:nullSafety // opt-into null safety
class Main {
static function main() {
new Route("example", null);
}
}
source/Main.hx:4: символы 24-28 : Нулевая безопасность: невозможно передать значение, допускающее значение NULL, в не допускающий значение NULL аргумент «обработчик» функции «новый».
Тем не менее, обратите внимание, что нулевая безопасность по-прежнему считается экспериментальной, и вы можете столкнуться с некоторыми неровностями здесь и там.