文法(5)ブロック、proc|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社エンジニアの「?」を「!」に。文法(5)ブロック、prochachi8833シェアツイートブックマークLINEこんにちは、hachi8833です。「Rubyスタイルガイドを読む」シリーズの文法編もいよいよ第5回目にさしかかりました。今回はブロックとProc関連です。block.Rubyを使い始めた頃はこの&:という書き方にちょっと戸惑いましたが、メソッドが1つの場合にブロックやブロック変数を書かなくて済むので慣れると便利ですね。良好names.map(&:upcase)なお&:を呼び出すには、そのメソッド(上の例ではupcase)にSymbol#to_procが実装されている必要があります。当然ながら、&:記法ではブロック変数を使えません。chaining.do...endの後ろにドット.でメソッドチェーンするのは見苦しいので避けるようにとのことです。methods?「複数行を{...}ブロックで囲んでメソッドチェーンするなら見苦しくはならないのでは?」という反論については、「そもそもブロックにコードを何行も書かなければならないなら別途メソッド化すべき」という立場を取っています。試しに以下のように書き換えてみると、「1行に収まる場合は原則{...}を使う」というスタイルとの共存が面倒になるのがわかります。...}.map(&:upcase)ルールを制定する側は例外事項をなるべく避けたいはずなので、「1行に収まる場合は原則{...}を使う」を優先したのだろうと推測しました。これに限りませんが、目安程度に考えるほうがよいスタイルもいくつかあります。指示に盲目的に従うよりも、時に応じ場合に即して使い分けたいものです。Proc.ブロックを&blockなどのブロック引数で受けることで、余分なブロックもyieldも使わずに済み、読みやすくなりますね。#{dir}"endその代わり、ブロックをブロック引数&blockに保存するときにProcオブジェクトに変換されるので、パフォーマンスとのトレードオフであることを理解して使いましょう。上で不可とされている書き方では、ブロックをコード中で直書きしているので、Procオブジェクトへの変換は発生しません。control.これはRubyのスタイルとして有名ですね。Rubyでは最後に実行した文の値が戻り値になるので、多くの場合returnは不要です。accessor.)これは同じクラスにある他のメソッドを呼ぶ場合の話ですね。書き込みアクセサの呼び出しの場合のみselfを付けるようにします。:verifiedend実際、上のコードはselfなしでも動作します。書き込みアクセサの呼び出しでselfを付けるのは、そうしないとstatusという変数を新規作成して代入することになってしまうためです。equivalent.以下の例では、optionsというアクセサがあり、さらに#initializeメソッドの仮引数であるローカル変数も同じ名前のoptionsになっています。これは確かに紛らわしいので、避けたいです。C#とF#が対象です今回はここまでとします。次回は等号=などの演算子関連のスタイルです。コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。enno.jpを運営。実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。Storageを使ってはいけない(翻訳)#Tags#会社紹介#自社サービス#勉強会#Rails#PHP#デザイン#実績#週刊RailsウオッチCONTACTお気軽にご相談ください。(翻訳)CONTACTTechRachoでは、パートナーシップをご検討いただける方からのご連絡をお待ちしております。お気軽にご意見・ご相談ください。