Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

スプラットを使用して、Rubyで配列を構築および分解します

Rubyについて私が気に入っていることの1つは、その機能の深さです。演算子を使用することもできますが、少し掘り下げると、その機能のほんの一部にすぎないことがわかります。謙虚な感嘆符演算子(* および** )は良い例です。

おそらく、「キャッチオール」引数にスプラットを使用したことがあります。そして、それはほとんどの人がそれらを使用するすべてです。

def go(x, *args)
  puts args.inspect
end

go("a", "b", "c")

newfangledキーワード引数構文を使用している場合は、次のように二重スプラットを使用します。

def go(**params)
  puts params.inspect
end

go(x: 100, y: 200)

これは便利ですが、スプラットをさらに多く使用できます。飛び込みましょう!

配列を使用して複数の引数を渡す

メソッドを定義するときにスプラットを使用できるだけでなく、メソッドを呼び出すときにもスプラットを使用できます。複数の引数を期待する関数に配列を渡すことができます。配列の最初の項目が最初の引数になり、2番目の項目が2番目の引数になります。

def go(x, y)
end

point = [12, 10]
go(*point)

また、新しいスタイルのキーワード引数にダブルスプラットを使用できることを忘れないでください:

def go(x:, y:)
end

point = { x: 100, y: 200 }
go(**point)
スプラットは最後に行く必要はありません

飛び散った引数を引数リストの最後に置くのが一般的ですが、それを要求する法律はありません。

スプラットは引数リストのどこにでも置くことができます。

def go(x, *args, y)
  puts x # => 1
  puts y # => 5
  puts args.inspect # => [2,3,4]
end

go(1, 2, 3, 4, 5)
配列の破棄

引数を使用したこれらのトリックはすべて、配列破壊の特殊なケースにすぎません。

「配列の破棄」という用語に慣れていない場合は、単に配列を個々の項目に分割することを意味します。次のようになります:

a, b = [1, 2]
puts a
# 1
puts b
# 2

これはうまく機能しますが、配列内のすべてのアイテムを保持する変数を指定する必要があるのは面倒な場合があります。スプラット演算子はこれを回避します-本質的にワイルドカードのように動作します。いくつかの例を見てみましょう。

配列から最初のアイテムをポップする

元の配列を変更せずに、配列から最初の項目をポップできると便利な場合があります。これがこの例の機能です。

first, *remainder = [1, 2, 3, 4, 5]
first
# => 1
remainder
# => [2, 3, 4, 5]

配列の残りの部分ではなく最初の項目が必要な場合は、次の構文を使用できます。

first, * = [1, 2, 3, 4, 5]
first
# => 1
最後のアイテムをポップする

アイテムを配列の最初ではなく最後から引き出すには、次のように最初にスプラットを貼り付けます。

*prefix, last = [1, 2, 3, 4, 5]
last
# => 5
prefix
# => [1, 2, 3, 4]

繰り返しますが、特定の変数が必要ない場合は、割り当てる必要はありません:

配列の最初と最後のn個のアイテムを取得します

スプラット演算子を中央に配置すると、配列の両端から任意の数のアイテムを引き出すことができます。

first, *, last =  [1, 2, 3, 4, 5]
first
# => 1
last
# => 5
制限

配列の破棄でsplat演算子を使用する場合でも、配列の先頭と末尾を基準にして配列項目の位置を指定する必要があります。したがって、長い配列の中央からアイテムを抽出するのに最適なツールではありません。

また、ダブルスプラット(**)を使用したクールなトリックを見つけることができないようです )ハッシュを台無しにする演算子。ラメ!

配列の構築

splat演算子は、配列を破棄するだけでなく、配列を作成する場合にも役立ちます。

次の例では、splatを使用して2つのアレイを結合しています。

[*[1,2], *[3,4]]
=> [1, 2, 3, 4]

これは、[[1, 2], [3,4]].flattenと同等です。 。

それが話の終わりであるならば、それはあまり役に立ちません。しかし、スプラットには別の独特の能力があります。オブジェクトをインテリジェントに配列に強制変換できます。

# Usually `*thing` wraps `thing` in an array
x = *"hi mom"
# => ["hi mom"]

# ...unless it's nil
x = *nil
# => []

# Arrays are passed through unchanged
x = *[1,2,3]
# => [1, 2, 3]

# But hashes are converted to arrays
x = *{a: 1}
# => [[:a, 1]]

これにより、大量の手動タイプの強制を行うことなく、アレイを構築するためのツールが提供されます。

たとえば、ある構成システムの文字列の配列を収集していると想像してください。通常は、次のことを行います。

  • アレイが存在するかどうかを確認し、存在しない場合は初期化します
  • 誰かが単一の文字列だけでなく文字列の配列を追加しようとした場合、インテリジェントに応答します

スプラット演算子はこれを無料で提供します:

# Your configuration hash may or may not have
# an existing :ignore array. 
config = { }

# The callback function might return an array
# or it might return a single item. 

def add_ignores
  "scoundrels" # could also be an array like ["scoundrels", "cads", "ne'er-do-wells"]
end

# This is where the magic happens. No matter what you 
# start with you get an array of things to ignore. 
config[:ignore] = [*config[:ignore], *add_ignores()]
それだけです

スプラットを使用するために、既存の配列操作コードをすべて書き直してはいけないことは明らかだと思います。これらは常に適切なツールであるとは限らず、頻繁に使用するとコードが読みにくくなる可能性があります。

ただし、アレイスプラットトリックがまさに必要なものである場合もあります。その時が来たら、ぜひお試しください。 :)


  1. GCE、クラウドストレージ、PubSubを使用してRubyで稼働時間監視システムを構築する

    稼働時間の監視には、Webサイト、API、およびサーバーの可用性のチェックが含まれます。モニターは、指定された間隔内で特定のエンドポイントをプローブして、それが使用可能かどうかを判別します。目標は、システムのSLAで指定されているように、契約レベルの可用性を達成し、契約が満たされていない場合の違いを判断することです。 この記事では、Prometheusblackbox_exporterに基づく稼働時間監視システムを構築します。カスタムHTTP監視システムを構築するのは簡単かもしれませんが、エクスポーターの周りにラッパーを構築することで、他の多くのプローブ手法にアクセスし、システムの他の要素を

  2. Rubyでのラムダの使用

    ブロックはRubyの非常に重要な部分であり、ブロックなしで言語を想像するのは難しいです。しかし、ラムダ?ラムダが好きなのは誰ですか?あなたはそれを使わずに何年も行くことができます。まるで過ぎ去った時代の遺物のようです。 ...しかし、それは完全に真実ではありません。ラムダを少し調べてみると、ラムダにはいくつかの興味深いトリックがあります。 この記事では、ラムダの使用法の基本から始めて、さらに興味深い高度な使用法に移ります。したがって、ラムダを毎日使用していて、それらについてすべて知っている場合は、下にスクロールするだけです。 Lambdasについて覚えておくべき主なことは、それらが関数の