Tuesday, June 12, 2012

VM to remove support for String + operator by June 17th

Posted by Seth Ladd

Today, the Dart VM team announced they will be removing support for String + operator from the VM on June 17th. In an email to the misc@dartlang.org group, Matthias Hausner wrote:

"On Sunday, June 17, we will turn off support for the String + operator in the VM compiler and runtime. Any code that still uses + will break.

You can test now whether your code is free of String + by invoking the VM with --allow_string_plus=false, or by locally editing runtime/vm/parser.cc and setting the default value of this flag to false and recompile the VM. Then, run your code and fix any fallout."

Rationale

After careful consideration, the string operator+ was removed because:
  • It causes puzzlers (exhibit A)
  • It's superfluous in the presence of string interpolation.
  • It encourages people to write inherently inefficient (quadratic) code.
Alternatives

You have three options to construct Strings, in the absence of the + operator.

String interpolation

String interpolation is great when you need to construct a simple string using other values. For example:


var to = 'Dart developer';
var msg = 'Hello $to!';
assert(msg == 'Hello Dart developer!');

StringBuffer

A StringBuffer allows you to build up a string without actually constructing a string instance. For example:

var to = 'Dart developer';
var buffer = new StringBuffer();
buffer.add('Hello ');
buffer.add(to);
buffer.add('!');
var msg = buffer.toString();
assert(msg == 'Hello Dart developer!');

String buffers are useful when you're building a string using a loop.

Adjacent string literals

When you have long string literals that should be split across different lines, the Dart runtimes will automatically concatenate adjacent string literals.

var longMessage = 'This is a long message that might exceed 80 '
                  'characters because I have '
                  'so much to say, so I split it across many '
                  'lines using adjacent string literals';

While Dart does support the triple-quote string (which allows you to write strings across many lines), sometimes you want to control leading and trailing spacing. In those cases, adjacent string literals is very useful.

Thanks for working with Dart! As always, the Dart discussion list is open for your thoughts and feedback.