Какво представляват низове в езика на дартс.
В Dart низът е подредена последователност от UTF-16 стойности, заобиколени от единични или двойни
кавички. Много хубава характеристика на езика е възможността за комбиниране на изрази в низове
чрез използване на ${expr} (съкращение за извикване на метода toString()).
// No differences between s and t var s = "Double quoted"; var t = 'Single quoted'; // Interpolate an integer into a string var age = 25; var myAge = "I am $age years old"; // Expressions need '{' and '}' preceeded by $ var test = "${25.abs()}" // This is redundant, don't do it because ${} already calls toString() var redundant = "${25.toString()}";
Низът може да бъде единичен или многоредов. Едноредовите низове са показани по-горе с помощта на единични или
двойни кавички, а многоредовите низове са написани с помощта на тройни кавички. Те могат да бъдат полезни, когато
искате да форматирате добре кода, за да го направите по-четлив.
// Very useful for SQL queries, for example var query = """ SELECT name, surname, age FROM people WHERE age >= 18 ORDER BY name DESC """;
В Dart няма тип char, представляващ един символ, защото има само низове. Ако
искате да получите достъп до конкретен знак от низ, трябва да използвате оператора []:
final name = "Alberto"; print(name[0]); // prints "A" print(name[2]); // prints "b";
Върнатата стойност на name[0] е низ, чиято дължина е 1. Препоръчваме ви да посетите 2
онлайн документацията на Dart за низове, която е супер полезна и пълна с примери.
var s = 'I am ' + name + ' and I am ' + (23).toString() + ' y.o.';
Можете да свързвате низове много лесно с оператора + по класическия начин, който повечето езици за програмиране поддържат. Официалните указания на Dart 3
предлагат да се предпочита използването на интерполация
за съставяне на низове, което е по-кратко и по-чисто:
var s = 'I am $name. I am ${25} years old';
В случай на низ, по-дълъг от един ред, избягвайте оператора + и предпочитайте просто прекъсване на реда.
Това е просто нещо, препоръчано от Dart поради стилистични причини, няма никакви последици за производителността
. Опитайте се да бъдете възможно най-последователни с езиковите указания!
// Ok var s = 'I am going to the' 'second line'; // Still ok but '+' can be omitted var s = 'I am going to the' + 'second line';
Тъй като низовете са неизменни, правенето на твърде много конкатенации с оператора + може да бъде
неефективно. В такива случаи би било по-добре, ако използвате StringBuffer, който ефективно свързва
низове. Например:
var value = ""; for(var i = 0; i < 900000; ++i) { value += "$i "; }
При всяко извикване на оператора + стойността се присвоява с нов екземпляр, който обединява старата
стойност и новата. С други думи, този код създава 900 000 пъти нов String обект,
по един за всяка итерация и изобщо не е оптимален. Ето как да тръгнете:
var buffer = StringBuffer(); for(var i = 0; i < 900000; ++i) buffer.write("$i "); var value = buffer.toString();
Това е много по-добре, защото StringBuffer не създава вътрешно нов низ при всяка итерация;
низът се създава само веднъж в момента, в който се извиква toString(). Когато трябва
да правите дълги цикли, които манипулират низове, избягвайте използването на оператора + и предпочитайте буфер. Същият
клас може да се намери и в Java и C# например.