我正在学习Scala从斯卡拉不耐烦和01章练习有问题
- take,drop,takeRight和dropRight字符串函数有什么作用?他们使用子串有什么优势或劣势?
我看到的唯一优势drop(和风味)不会抛出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
Run Code Online (Sandbox Code Playgroud)
还有什么?内存效率高?
Sha*_*nds 18
主要的好处是它允许您将String视为一个连续的字符集合,就像任何其他Seq或List实例一样.
实际上,这些方法(以及其他重要的转换函数,如map,flatMap和filter)都没有在String本身实现(实际上,它只是Java String类,而不是native-Scala类),但是在StringOps类中(它扩展了StringLike - > ... - > SeqLike),并且隐式转换可确保在需要访问这些方法时将String转换为StringOps.
这意味着你可以将一个String传递给一个列表操作函数,该函数将接收一个StringOps实例,像任何其他SeqLike实体一样处理它,而不需要知道它实际上是一个String,并且交回操作的结果, StringOps旨在以String形式呈现给您.
如果您知道某个实体是给定代码段中的String,请随意使用特定于String的方法,但此隐式转换的可用性意味着您还可以利用String的"字符序列"类似性质来实现在可能方便的情况下将其视为任何其他列表.
看来你是对的。所有这些操作都使用StringOps.slice方法,该String.substring方法委托给方法。
因此,除了包装字符串和执行边界验证的开销外,它与的调用相同substring。