我正在从Scala for the Impatient学习drop
,第01章练习有问题
- take,drop,takeRight和dropRight字符串函数是什么 做?他们使用子串有什么优点或缺点?
醇>
我看到唯一的优势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}}
还有什么?记忆效率高吗?
答案 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
的调用相同。