[解決済み] Rubyのブロックにおけるdo.endと中括弧の比較
2022-04-23 05:28:49
質問
Rubyで複数行のブロックを定義するのに、do..endを使わず中括弧を使うべきだと、積極的に説得してくる同僚がいます。
私は、短いワンライナーには中括弧だけを使い、それ以外はすべてdo.endを使う派です。しかし、私はより大きなコミュニティに働きかけて、何らかの解決策を得ようと考えました。
では、どちらなのでしょうか、そしてその理由は?(あるべき姿のコードの例)
context do
setup { do_some_setup() }
should "do somthing" do
# some more code...
end
end
または
context {
setup { do_some_setup() }
should("do somthing") {
# some more code...
}
}
個人的には、上記を見ただけで疑問が解けましたが、より大きなコミュニティーにこれを公開したいと思います。
解決方法は?
複数行のブロックにはdo..endを、1行のブロックには中括弧を使うのが一般的ですが、この例で説明できるように、両者には違いもあります。
puts [1,2,3].map{ |k| k+1 }
2
3
4
=> nil
puts [1,2,3].map do |k| k+1; end
#<Enumerator:0x0000010a06d140>
=> nil
つまり、{}はdo..endよりも優先順位が高いので、何を使うか決める際にはその点に注意してください。
追伸:もう一つ、自分の好みを確立するために覚えておきたい例があります。
次のようなコードです。
task :rake => pre_rake_task do
something
end
というのが本当の意味です。
task(:rake => pre_rake_task){ something }
そしてこのコード。
task :rake => pre_rake_task {
something
}
というのが本当の意味です。
task :rake => (pre_rake_task { something })
ですから、実際に欲しい定義を中括弧で囲んで得るには、こうしなければなりません。
task(:rake => pre_rake_task) {
something
}
パラメータに中括弧を使用することは、いずれにしてもやりたいことかもしれませんが、そうでない場合は、このような混乱を避けるために、これらのケースで do..end を使用することが最善でしょう。
関連
-
[解決済み】Ruby: 特定のバージョンのruby gemをインストールする方法は?
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Rubyで配列に値が存在するかどうかを確認する方法
-
[解決済み] Rubyからシェルコマンドを呼び出す方法
-
[解決済み] Rubyでnilとemptyとblankを理解する方法
-
[解決済み] Rubyのattr_accessorとは何ですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] Rubyで乱数を取得する方法
-
[解決済み] Ruby/RailsでHashからキーを削除して残りのHashを取得する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】gemのインストールができない - gemネイティブ拡張の構築に失敗 - そのようなファイルをロードできない -- mkmf (LoadError)
-
[解決済み】コレクションをDESCで並べる方法
-
[解決済み] erbでコメントを追加する最適な方法
-
[解決済み] PG::ConnectionBad - サーバーに接続できませんでした。接続が拒否されました。
-
[解決済み] railsアプリケーションでCookieのオーバーフロー?
-
[解決済み] gemのアップデート後、"Asset was not declared to be precompiled in production "でテストが失敗する。
-
[解決済み] サーバーはRailsで既に稼働している
-
[解決済み] bundle install --without production は何をするのですか?
-
[解決済み] レイル 4 radio_button_tag default not selected
-
[解決済み] 未初期化の定数 "コントローラ名"