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

キーワード引数、ハッシュ、およびスプラットを楽しむ

おそらく以前にこのパターンを見たことがあるでしょう。メソッドにはoptionsがあります 追加のパラメータを保持する最後の引数としてのハッシュ:

def hello_message(name_parts = {})
  first_name = name_parts.fetch(:first_name)
  last_name = name_parts.fetch(:last_name)

  "Hello, #{first_name} #{last_name}"
end

残念ながら、ハッシュからこれらのパラメータを抽出する必要があります。そして、それはあなたが良い部分に到達する前に通り抜ける多くのセットアップがあることを意味します。

ただし、Ruby 2.0以降でキーワード引数を使用するようにこのメソッドを変更した場合は、:first_nameをプルする必要はありません。 および:last_name ハッシュから。 Rubyがあなたに代わってそれを行います:

def hello_message(first_name:, last_name:)
  "Hello, #{first_name} #{last_name}"
end

さらに良いことに、アプリがRuby 1.9以降のハッシュ構文を使用している場合、メソッドはそれらのメソッドの呼び出し元を変更せずにキーワード引数を使用できます。

def hello_message_with_an_options_hash(name_parts = {})
  first_name = name_parts.fetch(:first_name)
  last_name = name_parts.fetch(:last_name)

  "Hello, #{first_name} #{last_name}"
end

def hello_message_with_keyword_arguments(first_name:, last_name:)
  "Hello, #{first_name} #{last_name}"
end

hello_message_with_an_options_hash(first_name: "Justin", last_name: "Weiss")

hello_message_with_keyword_arguments(first_name: "Justin", last_name: "Weiss")

見る?それらの議論は同じです!

キーワード引数の構文を1ステップ進めすぎます

まだしていない場合はどうなりますか ただし、新しいハッシュ構文に切り替えましたか? すべてのコードを変換できます。ただし、少なくともRuby 2.2.1では、古い ハッシュ構文はキーワード引数で問題なく機能します:

irb(main):007:0> hello_message_with_keyword_arguments(:first_name => "Justin", :last_name => "Weiss")
=> "Hello, Justin Weiss"

良い!ハッシュオブジェクトを渡すのはどうですか 、引数の代わりに?

irb(main):008:0> options = {:first_name => "Justin", :last_name => "Weiss"}
irb(main):009:0> hello_message_with_keyword_arguments(options)
=> "Hello, Justin Weiss"

うわあ。 ミックスしたい場合はどうしますか ハッシュとキーワードの引数?

irb(main):010:0> options = {last_name: "Weiss"}
irb(main):011:0> hello_message_with_keyword_arguments(first_name: "Justin", options)
SyntaxError: (irb):11: syntax error, unexpected ')', expecting =>
	from /usr/local/bin/irb:11:in `<main>'

わかった。私たちはその一歩を踏み出しすぎたと思います。これを修正するには、Hash#mergeを使用して、独自に渡すことができるハッシュを作成できます。 しかし、もっと良い方法があります。

キーワード引数の代わりに通常の引数を使用している場合は、*を使用して、配列から引数をスプラットできます。 :

def generate_thumbnail(name, width, height)
  # ...
end

dimensions = [240, 320]
generate_thumbnail("headshot.jpg", *dimensions)

しかし、キーワードをスプラットする方法はありますか 引数を引数リストに入れますか?

**があることがわかりました 。壊れた例を**で修正する方法は次のとおりです。 :

irb(main):010:0> options = {last_name: "Weiss"}
irb(main):011:0> hello_message_with_keyword_arguments(first_name: "Justin", **options)
=> "Hello, Justin Weiss"

そして、あなたが本当に クレイジー、通常の引数、キーワード引数、およびスプラットを混在させることができます:

def hello_message(greeting, time_of_day, first_name:, last_name:)
  "#{greeting} #{time_of_day}, #{first_name} #{last_name}!"
end

args = ["Morning"]
keyword_args = {last_name: "Weiss"}

hello_message("Good", *args, first_name: "Justin", **keyword_args) # => "Good Morning, Justin Weiss!"

もちろん、それが必要な状況に陥った場合は、おそらくもっと早く間違いを犯したでしょう!

キーワード引数を簡単にキャプチャする

*を使用してすべてのメソッド引数を配列に変換する方法を知っていますか ?

def argument_capturing_method(*args)
  args
end

argument_capturing_method(1, 2, 3) # => [1, 2, 3]

これは、キーワード引数でも機能します。それらはハッシュに変換され、argsの最後の引数として表示されます 配列:

argument_capturing_method(1, 2, 3, key: "value") # => [1, 2, 3, {:key=>"value"}]

ただし、args.last[:key] この方法で取得したキーワード引数を読み取るための最良の方法ではありません。代わりに、新しい**を使用できます キーワード引数を単独で取得するための構文:

def dual_argument_capturing_method(*args, **keyword_args)
  {args: args, keyword_args: keyword_args}
end

dual_argument_capturing_method(1, 2, 3, key: "value") # => {:args=>[1, 2, 3], :keyword_args=>{:key=>"value"}}

この構文を使用すると、args[0]を使用して最初の通常の引数にアクセスできます。 および:key keyword_args[:key]を使用したキーワード引数 。

…もちろん、オプションハッシュに戻ります。

キーワード引数は、コードから大量のパラメーター抽出ボイラープレートを削除するのに最適です。また、それらを利用するためにコードを変更する必要さえないかもしれません。

しかし、より一般的なメソッドを作成する場合、キーワード引数を適切に処理するために学習する必要のある新しい手法がいくつかあります。 これらの手法を頻繁に使用する必要はないかもしれません。しかし、そうするとき、この力と柔軟性がそこにあり、あなたを待っています。


  1. LoggerとLogrageを使用してRubyにログインする

    Rubyでのログの操作 ロギングは、アプリケーションが通常対処する主要なタスクの1つです。ログは、たとえば、必要なときに使用されます アプリ内で何が起こっているかを確認します それらを監視する、または 特定のデータの指標を収集します。 新しいプログラミング言語を学ぶとき、情報を記録するための最初の明白な選択は、ネイティブメカニズムです。通常、それは簡単で、文書化されており、コミュニティ全体に広く行き渡っています。 ログデータは、使用している会社、ビジネス、アプリケーションの種類によって大きく異なります。したがって、あなたとあなたのチームが選択したロギングソリューションがその全体的な使

  2. Vue、Vuex、Railsを使用したフルスタックアプリケーションの構築

    スケーラビリティを念頭に置いてフルスタックアプリケーションを構築することは、特に、完全なタイプスクリプトをサポートする最新バージョンのVueおよびVuexを使用して構築する場合、威圧的になる可能性があります。この記事では、不健康な家畜への治療の処方を管理するCRUDアプリケーションを探索することで、APIリクエストとデータベースの相互作用を処理するVuex4.0を使用した状態管理からスケーラブルなフルスタックアプリケーションを構築するために知っておく必要のあるすべてを読者に教えます。バックエンドはRailsで構築され、フロントエンドによる統合のために基本的なCRUDAPIを公開します。 ほと