drop,dropRight,take,takeRight vs substring?

时间:2015-07-29 21:51:56

标签: string scala

我正在从Scala for the Impatient学习drop,第01章练习有问题

  
      
  1. take,drop,takeRight和dropRight字符串函数是什么   做?他们使用子串有什么优点或缺点?
  2.   

我看到唯一的优势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

例如:

{{1}}

还有什么?记忆效率高吗?

2 个答案:

答案 0 :(得分:15)

主要的好处是它允许您将String视为连续的字符集,就像任何其他Seq或List实例一样。

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

这意味着你可以将一个String传递给一个列表操作函数,该函数将接收一个StringOps实例,就像任何其他SeqLike实体一样工作,而不需要知道它实际上是一个String,并交回结果操作,StringOps旨在以String形式呈现给您。

如果您知道某个实体是给定代码段中的String,请随意使用特定于String的方法,但这种隐式转换的可用性意味着您还可以利用String' s& #34;字符序列"类似于在可能方便的情况下将其视为任何其他列表的性质。

答案 1 :(得分:4)

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

因此,除了包装字符串和执行边界验证的开销之外,它与substring的调用相同。