是否有一种简洁的表示法来访问数组的最后一个元素,类似于C++中的std::vector::back()?我需要写这样的代码吗:
```c++ array[array.length - 1] ```
每次?
```c++ array[array.length - 1] ```
veryLongArrayName.[veryLongArrayName.Length-1]
每次?
从评论扩展
内置选项为Seq.last veryLongArrayName
,但请注意这是O(N)而不是O(1),因此除了最小的数组外,对于实际使用来说可能过于低效。
话虽如此,自己抽象这个功能也没有什么害处:
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
[<RequireQualifiedAccess>]
module Array =
let inline last (arr:_[]) = arr.[arr.Length - 1]
Array.last veryLongArrayName
而不会有任何额外的开销,同时保持代码非常惯用和易读。Array
模块有它们。实际上,第一个属性会导致Array
模块在IL中被命名为ArrayModule
(即如果它是公共的,其他语言将如何看待它),而第二个属性则禁止执行open Array
。 - ildjarn我在官方文档中没有找到,但是 F# 4 似乎已经内置了 Array.last
方法:
/// Returns the last element of the array.
/// array: The input array.
val inline last : array:'T [] -> 'T
open System.Collections.Generic
[<AutoOpen>]
module IListExtensions =
type IList<'T> with
member self.Last = self.[self.Count - 1]
let lastValue = [|1; 5; 13|].Last // 13
Seq.last veryLongArrayName
,但效率远不如直接编写一个内联函数并每次调用它。 - ildjarnSeq.last
已经在这里设置了先例;back
是 C++ 的一个术语,主要是由于标准库需要区分迭代器和值(即end
vs.back
)。 - ildjarn