5

C++ の std::vector::back() に似た、配列の最後の要素にアクセスするための簡潔な表記法はありますか? 私は書く必要がありますか:

veryLongArrayName.[veryLongArrayName.Length-1]

毎回?

4

3 に答える 3

10

コメントから展開

組み込みオプションは ですがSeq.last veryLongArrayName、これは O(1) ではなく O(N) であることに注意してください。そのため、最小の配列を除くすべての場合、実際に使用するにはおそらく非効率的です。

とはいえ、この機能を自分で抽象化しても害はありません。

[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
[<RequireQualifiedAccess>]
module Array =
    let inline last (arr:_[]) = arr.[arr.Length - 1]

Array.last veryLongArrayNameこれで、コードを非常に慣用的で読みやすく保ちながら、オーバーヘッドをまったく発生させることなく実行できます。

于 2013-03-01T18:31:49.573 に答える
8

公式ドキュメントには記載されていませんが、F# 4 はArray.lastそのまま実装されているようです。

/// Returns the last element of the array.
/// array: The input array.
val inline last : array:'T [] -> 'T

github の実装へのリンク

于 2016-05-20T22:50:58.230 に答える
6

_[] の関数を記述する代わりに、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
于 2013-03-04T14:48:41.897 に答える