Dartでオブジェクトの完全な(深い)コピーを作成するための言語サポートされた方法はありますか?
セカンダリのみ;これを行う方法は複数ありますが、違いは何ですか?
説明してくれてありがとう!
未解決の問題が示唆する限り、いいえ:
http://code.google.com/p/Dart/issues/detail?id=3367
そして具体的に:
.. Objects have identity, and you can only pass around references to them. There is no implicit copying.
ダーツの組み込みコレクションは、「from」と呼ばれる名前付きコンストラクタを使用してこれを実現します。この投稿を参照してください: Dartでリスト、マップ、またはセットを複製
Map mapA = {
'foo': 'bar'
};
Map mapB = new Map.from(mapA);
あまり複雑でないオブジェクトの場合、変換ライブラリを使用できます。
import 'Dart:convert';
そして、JSONエンコード/デコード機能を使用します
Map clonedObject = JSON.decode(JSON.encode(object));
クローンするオブジェクトの値としてカスタムクラスを使用している場合、クラスはtoJson()メソッドを実装する必要があるか、JSON.encodeメソッドにtoEncodable関数を提供し、decode呼び出しにreviverメソッドを提供する必要があります。 。
パーティーには遅れましたが、私は最近この問題に直面し、次のように何かをしなければなりませんでした:-
class RandomObject {
RandomObject(this.x, this.y);
RandomObject.clone(RandomObject randomObject): this(randomObject.x, randomObject.y);
int x;
int y;
}
その後、次のように、オリジナルを使用して単にコピーを呼び出すことができます:-
final RandomObject original = RandomObject(1, 2);
final RandomObject copy = RandomObject.clone(original);
クラスがあるとしましょう
Class DailyInfo
{
String xxx;
}
クラスオブジェクトdailyInfoの新しいクローンを作成する
DailyInfo newDailyInfo = new DailyInfo.fromJson(dailyInfo.toJson());
これが機能するには、クラスが実装されている必要があります
factory DailyInfo.fromJson(Map<String, dynamic> json) => _$DailyInfoFromJson(json);
Map<String, dynamic> toJson() => _$DailyInfoToJson(this);
これを使用してクラスをシリアライズ可能にすることで実行できます
@JsonSerializable(fieldRename: FieldRename.snake, includeIfNull: false)
Class DailyInfo{
String xxx;
}
Dartが提供するコピー可能なインターフェースを使用してみます。
[ https://pub.dev/documentation/copyable/latest/index.html#usage] [1]
モデルオブジェクトを値で渡す:
エンティティタイプであり、fromMap()
、toMap()
関数を実装している場合、これは、新しく作成された顧客を与えます。
Customer.fromMap(customerObject.toMap())
残念ながら言語サポートはありません。私がやったことは、コピーしたいクラスに実装できるcopyable
という抽象クラスを作成することです。
abstract class Copyable<T> {
T copy();
T copyWith();
}
次に、これを次のように使用できます。 Locationオブジェクトの場合:
@override
Location copy() {
return Location(
longitude: this.longitude,
latitude: this.latitude,
timestamp: this.timestamp,
country: this.country,
locality: this.locality,
postalCode: this.postalCode,
name: this.name,
isoCountryCode: this.isoCountryCode,
bearing: this.bearing);
}
@override
Location copyWith({
String country,
String locality,
String name
}) {
return Location(
country: country,
locality: locality,
name: name,
longitude: this.longitude,
latitude: this.latitude,
timestamp: this.timestamp,
postalCode: this.postalCode,
isoCountryCode: this.isoCountryCode,
bearing: this.bearing);
}
スプレッド演算子はどうですか?
var a = MyClass();
var b = [...[a]][0]; // copy of a