Soru Bir Sembolü Dize Dönüştürme


Bir Sembolü bir String'e dönüştürmenin bir yolu var mı?

Örneğin, bir VariableMirror Dizeler yerine Semboller döndürür. Bir Sembolü bir String'e dönüştürmenin bir yolu var mı, bu yüzden bir sınıfın tüm değişken isimlerini yazdırabilir miyim?


18
2018-04-17 11:12


Menşei




Cevaplar:


kullanım MirrorSystem.getName ():

import 'dart:mirrors';

void main() {
  var sym = new Symbol('test');
  print(MirrorSystem.getName(sym));
}

Bu çıktılar:

Ölçek

21
2018-04-17 18:05



Muhteşem. Teşekkür ederim. - Victor Savkin
Başarısız, ancak kararsız ve html dart için pakete ek megabayt ekler. Ve aynalar şimdilik çarpıklık için desteklenmiyor (( - Soul_man


Ben de bu soru üzerine yığılıyorum.
Paketimde 'dart: mirrors' kullanamıyorum, bu yüzden aşağıdakileri kullanarak:

String s = new Symbol('hi').toString();
s = s.substring(8,pn.length-2);

Korkunç görünüyor ama işin bitmesine neden oluyor. Belki de bir performans sorunu var.

Düzenle:

Şans, minimize edilmiş JS'de büyük şeyleri kırıyor. Stongly cesaretini kırdı! `Günter Zöchbauer

Bunun hakkında düşünmedim, teşekkürler.
Şimdi çalışsa bile, gelecekte kırılma ihtimali vardır, bu yüzden 'toString ()' daha iyi kaçınılmalıdır.

Onaylandı:

Warning: 'hi=' is used reflectively but not in MirrorsUsed. This will break minified code.index.bootstrap.initialize.dart.js:7612 
Warning: 'hi' is used reflectively but not in MirrorsUsed. This will break minified code`

2
2018-02-18 18:11



Şans, kıymetli JS'de büyük şeyleri kırar. Stongly cesaretini kırdı! - Günter Zöchbauer
Bütün amacını bildiğim kadarıyla Symbol sadece yerine String Minification tanımlayıcı isimleri mangles zaman kırılmasını önlemek oldu. - Günter Zöchbauer
@ Günter Zöchbauer Hmm, teşekkürler. Muhtemelen Aynalar, derleme zamanında oluşturulmuş dizge dönüştürme tablosunun dahili bir sembolüne veya küçültmeden önce yöntem isminin, küçülmeden sonra addan hesaplanabileceği anlamına gelir. Şimdi Aynalara gireceğim ... - TastyCatFood
Detayları bilmiyorum. sanırım dart2js ilişkiyi bozmayacak şekilde farklı davranır. - Günter Zöchbauer


Kolay bir çözüm olduğu ortaya çıkıyor

print(MirrorSystem.getName(symbol));

baskılar

somename

Ayrıca bakınız: https://code.google.com/p/dart/issues/detail?id=17471

DÜZENLE 

Yukarıda @lrn bağlantısı verilen konuya ilginç bir yorum

Bu amaçla "kullanımı zor". Semboller dart2js ile minimize edilebilir ve orijinal adlarına bakmak sadece ayna sistemi ile yapılır. Bu, dart2js'nin, özelliğin kullanılıp kullanılmadığını ve gerekli değilse bir çeviri tablosu içermemesini sağlar.   Genelde, eğer mümkün olursa, sembolleri dizgeye çevirmek zorunda kalmayacak şekilde kodlamanızı tavsiye ederim. Onları opak jetonlar olarak ele alın ve sadece bunları diğer jetonlarla karşılaştırın.

duman paketi Bunun için, dönüştürülmüş JavaScript'de de çalışacak şekilde dönüştürücüye kod çevrilen bir hizmet sağlar. symbolToName() ve nameToSymbol().


2
2018-03-15 08:59





Bazı örnek kod:

// Listen for App changes so we can do some things.
app.changes.listen((List<ChangeRecord> records) {
  PropertyChangeRecord record = records[0] as PropertyChangeRecord;
  String changedValue = MirrorSystem.getName(record.name);

  if (changedValue == "pageTitle") {
    print("$changedValue changed!");
  }
}

0
2017-08-29 19:01