在Dart中,工厂构造函数需要来自编码器的更多逻辑,但与const类型不同,除非它们允许"非最终"实例变量.
它们对const构造函数的优点是什么?
谢谢你们.
编辑
下面是关于Seth Ladd的博客'Dart - 试图了解'工厂'构造函数'的价值的工厂构造函数的用法.
class Symbol {
final String name;
static Map<String, Symbol> _cache = new Map<String, Symbol>();
factory Symbol(String name) {
if (_cache.containsKey(name)) {
return _cache[name];
} else {
final symbol = new Symbol._internal(name);
_cache[name] = symbol;
return symbol;
}
}
Symbol._internal(this.name);
}
main() {
var x = new Symbol('X');
var alsoX = new Symbol('X');
print(identical(x, alsoX)); // true
}
Run Code Online (Sandbox Code Playgroud)
恕我直言,与一般的构造函数,可以实现相同的效果与微妙的差异,但相当简单.
class Symbol {
static final Map<String, Symbol> cache = {};
final String name;
Symbol(name) …Run Code Online (Sandbox Code Playgroud) 下面是关于Seth Ladd的博客' Dart - 试图了解'工厂'构造函数'的价值的工厂构造函数的用法.
class Symbol {
final String name;
static Map<String, Symbol> _cache = new Map<String, Symbol>();
factory Symbol(String name) {
if (_cache.containsKey(name)) {
return _cache[name];
} else {
final symbol = new Symbol._internal(name);
_cache[name] = symbol;
return symbol;
}
}
Symbol._internal(this.name);
}
main() {
var x = new Symbol('X');
var alsoX = new Symbol('X');
print(identical(x, alsoX)); // true
}
Run Code Online (Sandbox Code Playgroud)
恕我直言,与一般的构造函数,可以实现相同的效果与微妙的差异,但相当简单.
class Symbol {
static final Map<String, Symbol> cache = {};
final String name;
Symbol(name) {
cache[name] …Run Code Online (Sandbox Code Playgroud) 两个问题。首先,下面是强类型。
String msg = "Hello world.";
msg = "Hello world again.";
Run Code Online (Sandbox Code Playgroud)
而且,低于动态
var msg = "Hello world.";
msg = "Hello world again.";
Run Code Online (Sandbox Code Playgroud)
上面的两个'msg'有什么区别吗?
其次,如果我使用 'new' 关键字来启动一个变量,如下所示,
Map myMap = new Map;
Run Code Online (Sandbox Code Playgroud)
为什么要指示变量'myMap' 是一个Map 实例(Map myMap),因为'new' 关键字已经包含相同的含义?所以,是不是没关系,
myMap = new Map;
Run Code Online (Sandbox Code Playgroud)
因为 'new' 关键字已经暗示新启动的变量既是变量又是 Map 类型,我不明白为什么通常 'Map' 关键字与变量名称一起使用,甚至 'var' 也是如此。
有没有人对此有任何想法(似乎有点多余)Dart 语法?
即使我故意删除了'return'命令,下面的函数也能正常工作.
main() {
add(i) => i + 2; //I intentionally deleted 'return'
print(add(3)); //5
}
Run Code Online (Sandbox Code Playgroud)
但是,在我故意删除'return'命令后,下面的函数不起作用.
main() {
makeAdder(num addBy) {
return (num i) {
addBy + i; //I intentionally deleted 'return'
};
}
var add2 = makeAdder(2);
print(add2(3) ); //expected 5, but null.
}
Run Code Online (Sandbox Code Playgroud)
编辑澄清我的问题.
在上面的后一个函数中的最后一个句子,add2(3)不返回一个值(我期望5)但只返回null.
我的问题是为什么后一个函数的'addBy + i'与第一个函数的'add(i)=> i + 2'返回'i + 2'的事实相反.
再次编辑. 答案是"=>"为{return},而不仅仅是{}.
main() {
makeAdder(num addBy) => (num i) { return addBy + i; };
var add2 = makeAdder(2);
print(add2(3) ); // 5
} …Run Code Online (Sandbox Code Playgroud)