有没有简洁的表示法来访问数组的最后一个元素,类似于C++中的std :: vector :: back()?我必须写:数组最后一个元素的简明表示法
veryLongArrayName.[veryLongArrayName.Length-1]
每次?
有没有简洁的表示法来访问数组的最后一个元素,类似于C++中的std :: vector :: back()?我必须写:数组最后一个元素的简明表示法
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
没有任何开销,同时保持代码非常地道和可读性。
太棒了!我会复制并粘贴到有用的技巧文件袋中。我刚刚在几天前开始使用F#,因此需要花费我几天的时间才能找出这些属性的含义。 – 2013-03-01 22:09:26
@Paul:属性不是必须的,我只是添加它们,因为内置的F#'Array'模块具有它们。从本质上讲,第一个属性导致'Array'模块在IL中被命名为'ArrayModule'(即这是其他语言在公开时将会看到它的方式),第二个属性禁止执行'open Array'。 – ildjarn 2013-03-01 22:20:33
作为替代写一个函数_ [],你也可以写的IList <的扩展属性“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
我不能在官方文档,但F#4似乎有开箱实施Array.last
:
/// Returns the last element of the array.
/// array: The input array.
val inline last : array:'T [] -> 'T
谢谢你让我知道。我认为这是对F#核心的有益补充。 – 2016-05-20 23:17:01
你可以做'Seq.last veryLongArrayName',但它不会有效。为什么不直接为此写一个内联函数并每次调用_that_? – ildjarn 2013-02-28 20:30:28
@ildjarn有趣的是,我只是重读我的问题,我想到了同样的答案。唯一的缺点是主观语言方言的创造:有些人会使用“背部”,其他人可能会喜欢“最后”更好,等等。 – 2013-02-28 20:36:12
'Seq.last'已经在这里设置先例; 'back'是一个C++ ism,很大程度上是由于标准库需要区分迭代器和值(即'end'和'back')。 – ildjarn 2013-02-28 22:09:31