🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1145閲覧

Rubyの複数行の処理を変数に代入している構文を理解したい

k499778

総合スコア599

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/03/27 17:41

前提・実現したいこと

Javaエンジニアですが、現在Ruby,Railsを勉強しています。
以下を参考にRailsでAPIを叩く方法を学んでいます。
railsふかぼり01:railsでWebAPIを叩く

その中で以下のようなコードが有りました。まさにAPIを叩くところなのですが。

ruby

1# 新しくHTTPセッションを開始し、結果をresponseへ格納 2 response = Net::HTTP.start(uri.host, uri.port) do |http| 3 # 接続時に待つ最大秒数を設定 4 http.open_timeout = 5 5 # 読み込み一回でブロックして良い最大秒数を設定 6 http.read_timeout = 10 7 # ここでWebAPIを叩いている 8 # Net::HTTPResponseのインスタンスが返ってくる 9 http.get(uri.request_uri) 10 end

上記のコードでresponseに複数行の処理が代入されているように見えるのですが、このような構文はなんというのでしょうか?どういった文法・ルールに基づいているのでしょうか。

複数行にまたがる処理(Net〜end)を変数に代入している状況が、少し腑に落ちておらず、詳しく理解したいです。
有識者の方よろしくお願いいたします。

試したこと

Net::HTTP.start自体は調べて、HTTPリクエストを投げるときの定型文程度に思っています。
https://docs.ruby-lang.org/ja/latest/method/Net=3a=3aHTTP/s/start.html

しかし、複数行の処理を変数に代入しているところがやはりどんな文法やルールをもとに行っているのかがわかりません。

補足情報(FW/ツールのバージョンなど)

ruby 2.5.7p206
Rails 6.1.3.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

処理を代入しているわけではなくて、処理の結果(startメソッドの返す値)を代入しています。

doendはブロックと言って、基本的な部分なので、入門書の前半に書いてある物です。
他の言語で言うと、無名関数をメソッドの引き数に渡しているような物です。何を引き数にしてどのタイミングでコールバックされるかはメソッドのリファレンスに書いてあります。

投稿2021/03/27 18:06

otn

総合スコア85886

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k499778

2021/03/28 00:40

ありがとうございます。 ruby 無名関数 などで調べてみます。
otn

2021/03/28 02:15

検索するなら「ruby ブロック」でしょうが、基本事項なのでググるより入門書ですね。
k499778

2021/03/28 05:59

do end をeach文で使うものであったり、波括弧のイメージがありましたが、 少し異なるようですね。もう少し腑に落ちるまで調べてみます。 かしこまりました。ありがとうございます
otn

2021/03/28 06:15

do end と { } は、結合優先度を除いて同じです。 まあ、この結合優先度が、メソッド呼び出しの()を省略できるのと相まって、うっかりすると間違いの元ですが。
guest

0

複数行にまたがる処理(Net〜end)を変数に代入している状況が、少し腑に落ちておらず、詳しく理解したいです。

https://xtech.nikkei.com/it/article/COLUMN/20060825/246409/
第5回 高階関数を分かりやすくしたブロック

がわかりやすいと思う。(ただこのWeb版はもともとの書籍に比べると非常に見づらいのが難点)

投稿2021/03/27 22:29

sigsegv

総合スコア895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k499778

2021/03/28 00:39

ありがとうございます。確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問