【问题标题】:Raw Strings , how are these different from escaped strings and where should be use these原始字符串,这些与转义字符串有何不同以及应该在哪里使用这些
【发布时间】:2019-02-24 09:28:42
【问题描述】:

根据我的研究,

Kotlin 有两种类型的字符串字面量:-

转义字符串,其中可能包含转义字符。

val s = "Hello ,World\n" +
    "from escaped string\n"+
    "kotlin"

原始字符串由三引号 (""") 分隔,不包含转义,并且可以包含换行符和任何其他字符:

val m = """Hello, World
       |from raw string
       |kotlin """.trimMargin()

这些字符串可以在多行中使用,而不需要连接每一行和一个而不需要转义。

我们使用原始字符串只是为了简单和易于实现,还是在任何情况下都提供更好的性能?

还有其他我们应该考虑使用原始字符串的用例吗?

【问题讨论】:

  • Do we use raw strings only for simplicity and easy implementation? 通常是的。

标签: android string performance kotlin


【解决方案1】:

您的答案在this website 得到了很好的解释。我将在这里只包括它的重要部分。

String in Kotlin 可以以多种方式使用,如上述链接中所述。这完全取决于使用的要求。如果您有 extra large 字符串(如 html 页面等),那么您可以使用由三引号 (""") 分隔的 Raw string。在您有 short 的地方 字符串,那么您可以使用 转义字符串

这些之间没有真正的性能差异,但取决于您在其中构建值时使用了多少字符串连接。

【讨论】:

    【解决方案2】:

    我不知道这两种字符串字面量类型之间的任何性能差异,但至少有一个有趣的用例应该考虑使用原始字符串:正则表达式。

    正则表达式中的预定义字符类和许多其他结构由\ 字符引入(例如\s 匹配空白字符)。当在字符串中包含这些字符时,您需要对它们进行转义:因此,对于正则表达式中的任何此类字符,您需要写两个,例如 "\\d" 以匹配单个数字。

    但是,原始字符串允许您跳过转义部分,从而使正则表达式比您在转义唯一字符串文字类型时编写的更简洁、更简洁,就像在 Java 中发生的那样。

    请注意,原始字符串并不是 Kotlin 引入的新概念或想法。例如,Python 已经拥有它们很长时间了。

    【讨论】:

    • 类似的情况是需要转义美元符号“$”以避免插值。
    【解决方案3】:

    用例:Room 查询中的查询语法着色

    使用 Kotlin 的原始字符串,您可以在 Room 的 Dao 中编写多行查询,例如:

    @Dao
    interface HappyDao {
        @Query(
                """
                SELECT
                One,
                Two,
                Three
                FROM MYTABLE
                """
        )
        fun getAll(): List<MyObject>
    }
    

    并且仍然具有 Room 验证器的 语法着色,就好像您将所有内容都写在一行上一样(以及代码编写期间查询语法错误的警报)。对于长查询、包含许多字段或连接的查询尤其有用。

    如果没有原始字符串,它会是这样的:

    @Dao
    interface HappyDao {
        @Query(
                "SELECT" +
                "One," +
                "Two," +
                "Three" +
                " FROM MYTABLE"
        )
        fun getAll(): List<MyObject>
    }
    

    它不会受益于 Room 的语法着色。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      相关资源
      最近更新 更多