+для конкатенации строк — неудачное решение, так как:
- Он некоммутативен в отличие от операции сложения, обозначаемой символом
+
. Этот аргумент приводят, в частности, разработчики языка программирования Julia:
https://docs.julialang.org/en/latest/manual/...:
И я предлагаю сделать оператор
In mathematics,+
usually denotes a commutative operation, where the order of the operands does not matter. An example of this is matrix addition, whereA + B == B + A
for any matricesA
andB
that have the same shape.+
строго коммутативным и при наличииF +(MyType, Int)
запретить перегрузкуF +(Int, MyType)
. Это немного уменьшит работу программисту по заданию дополнительных перегрузок операторов, и одновременно повысит предсказуемость программ [{…}]. - В некоторых языках (например в PHP и Perl) сложение "5"+5 даёт 10.
- Наткнувшись на
Dart Puzzlers: Chapter 2:
я вспомнил, что удобно иметь возможность конкатенации строкового литерала и числа без явного преобразования числа к строке, и у меня родился такой [более жизненный, чем 2+2] пример:
Can you guess what the following statement prints?
System.out.println("2 + 2 = " + 2+2);
Translating this mini-puzzle into Dart, we get:
print('2 + 2 = ' + 2+2);
Both the Java and Dart versions print2 + 2 = 22
, which may not be what you expected.
print("id=" + id+1)
Dart Puzzlers: Chapter 2:
Эту проблему также [как и в пункте 3] решает отдельный оператор для конкатенации строк, так как приоритет этого оператора можно сделать ниже, чем у оператора сравнения
... System.out.println("Animals are equal: " + pig == dog); ...
It doesn't printAnimals are equal: true
. It doesn't printAnimals are equal: false
, either. It just printsfalse
. Why? Because the+
operator binds tighter than the==
operator.==
.
По этим [и/или каким-то ещё] причинам от
+для конкатенации строк отказались во многих языках (PHP, Perl, D, Lua, Julia, Visual Basic, Nim, Dart), вот только однозначного обозначения для этой операции, к сожалению, до сих пор так и не определили [{…}], поэтому я решил попробовать пойти другим путём и вообще отказаться от оператора конкатенации строк. Для конкатенации строкового литерала и переменной в 11l достаточно просто расположить их рядом без пробелов:
print("id="id) print("id="(id+1))Для конкатенации двух переменных используется такая форма записи:
print(name""value)или такая:
print(name‘’value)В последнем случае используются "сырые" строки — их необходимо заключать в одиночные парные кавычки — символы
‘и
’, и их использование предпочтительно в 11l.
Подряд идущие же строки [одного типа (‘’ или "")] не склеиваются в одну {…}, за исключением склеивания переменных:
‘Значение = ’value"\n", а также разнородных строк:
‘неразрывный’"\xA0"‘пробел’— при этом между строковым литералом и переменной (или строковым литералом другого типа) не должно быть разделителей.
ПочемуПотому что у+для строк — плохо, а*— нет?
*практически всегда один из операндов является строковым литералом [
"s" * n/
n * "s"] и такую операцию сразу заметно.