为什么多行字符串有这么奇怪的语法? (他们这样做的时候)

时间:2010-08-24 20:36:49

标签: string-literals multilinestring

我可能缺少一些非常简单的东西,但是让一个字符串进入多行会有什么问题?

例如,Ruby是:

 text = <<END
     Some 
     text 
  END

Python就是:

text = """
   Some 
   text
 """

而C#是:

string text = @"
     Some 
     Text";

哪个更接近,但仍然需要@角色。

使用这样的单行有什么问题:

 text = "
    Some 
    text
  "

我认为在这种情况下,字符串文字可以结束,其中(“)单独出现,这样,如果在路上找到引号,它们将被忽略。

text = "
  He said "This is cool"
  But it wasn't , until "
 " //<-- quote mark alone  

有什么理由可以避免在许多编程语言中使用单引号多行字符串文字,即Java,JavaScript,C#,C ++,C,Ruby,Python?

3 个答案:

答案 0 :(得分:3)

首先,解析是一个恐怖 - 取决于语法的其余部分是多么简单,这个单一的“便利特征”可能会使前端数量级变得更加复杂。有关详细信息,请参阅dierre的答案。

另一个原因是这样的语法可能很危险 - 忘记一个关闭引用,你有一个巨大的字符串和一个小得多的程序;)

第三, 经常不需要多行字符串(特别是在连接多个行(如C和Python)中连接相邻文字字符串的语言中)。与上述缺点相比,它只是没有回报。

答案 1 :(得分:2)

我能想到所需特定语法的唯一原因是因为您不必担心转义字符。我不确定这是什么原因,但这肯定是这种语法的一个优点。

当您必须定义语法时,最后一个示例有点问题,因为您使用单个标记"来执行多个操作并且使用标准LALR(1)并不容易,您需要更多输入中的标记,用于预测正确使用的规则。

有关LALR parser的更多信息。

答案 2 :(得分:0)

我怀疑其中一部分是试图允许合适的格式化。

在C或C ++中,你总是可以将一个长字符串写成一个长字符串,但这会向右延伸,如果它包裹起来就会变得很难看。允许将其拆分使得更容易保持程序的格式保持不变。通常,C和C ++程序不会大量使用多行字符串,因此可以更改语言以使其更方便。

通常有用的是在字符串中明确显示行尾等,并允许它保持周围程序的格式。能够按照您希望的方式编写文字字符串有时也很有用,Ruby,Python和C#示例显示了以您希望的方式编写文字多行字符串的方法。

您的建议侵入格式化,就像Ruby和Python示例一样,并且看起来不是更好的解决方案。将这些字符串与普通字符串混淆是太容易了,而Ruby和Perl HERE文档以及Python三重引用显示了这些字符串的确切内容。