String 放下,放下,放下,放下,放下,放下对子串?

String 放下,放下,放下,放下,放下,放下对子串?,string,scala,String,Scala,我正在学习Scala,第01章练习有问题 take、drop、takeRight和dropRight字符串函数是什么 做与使用子字符串相比,它们有什么优点或缺点 我看到的唯一优点是drop(和flavors)不会抛出IndexOutOfBoundsException 例如: scala> "Hello World!" dropRight 100 res26: String = "" scala> "Hello World!" substring 100 java.lang.Stri

我正在学习Scala,第01章练习有问题

  • take、drop、takeRight和dropRight字符串函数是什么 做与使用子字符串相比,它们有什么优点或缺点
  • 我看到的唯一优点是
    drop
    (和flavors)不会抛出
    IndexOutOfBoundsException

    例如:

    scala> "Hello World!" dropRight 100
    res26: String = ""
    
    scala> "Hello World!" substring 100
    java.lang.StringIndexOutOfBoundsException: String index out of range: -88
      at java.lang.String.substring(String.java:1919)
      ... 33 elided
    

    还有什么?内存效率?

    主要的好处是,它允许您将字符串视为字符的顺序集合,就像任何其他Seq或List实例一样

    事实上,这些方法(以及其他重要的转换函数,如map、flatMap和filter)并不是在String本身中实现的(实际上,它只是Java String类,而不是本机Scala类),而是在StringOps类中实现的(它扩展了StringLike->…->SeqLike),隐式转换可以确保在您需要访问这些方法时将字符串转换为StringOps

    这意味着您可以将一个字符串传递给列表操作函数,该函数将接收一个StringOps实例,像处理任何其他SeqLike实体一样处理它,而无需知道它实际上是一个字符串,并将操作结果交还给您,StringOps的设计目的是将操作结果作为字符串呈现给您


    如果您知道一个实体是给定代码段中的字符串,可以随意使用特定于字符串的方法,但这种隐式转换的可用性意味着您还可以利用字符串的“字符序列”-就像大自然一样,在方便的情况下,把它当作任何其他列表来对待。

    似乎你是对的。所有这些操作都使用
    StringOps.slice
    方法,该方法委托给
    String.substring
    方法


    因此,除了包装字符串和执行边界验证的开销外,对
    子字符串

    的可读性和易出错性的调用是相同的
    s.takeRight(4)
    s.substring(最大0(s.length-4),s.length)
    可读性好得多,后者是否正确?它可能会被一个或一些东西去掉,很难确定是否只是盯着它看。