シンタックスシュガー21選
あなたが使うべき Ruby Tips 21選 - One By One - norizo333's Blog -より、21 Ruby Tricks You Should Be Using In Your Own Codeを見てみました。
Rubyも割と使えるようになったと思っていましたが、結構知らないものもあったので、まだまだだと痛感します。
以下、一つずつ確認していきます。
一応ですが、()内は私が勝手に訳しただけなので、正確ではないかもしれません。
1 - Extract regular expression matches quickly(正規表現での即時抽出)
String#matchをString#[]で代用してしまう方法のようです。
可読性を考えるとあまり使いたくないですね。省略できるのも実は"match()"だけですし。
個人的には以下の方がマッチ演算の面影をはっきり残していて好みですが、もしかすると性能的な違いがあるかもしれません。
email =~ /<(.*?)>/ && $1
2 - Shortcut for Array#join(Array#joinの省略)
Arrayで'*'演算子を使うとjoinになるということのようです。
'*'だと全要素の末尾に付くというイメージが沸くので、どうも不自然に見えます。これも私は使いそうにないです。
3 - Format decimal amounts quickly(数量の即時書式化)
4 - Surround text quickly(文章の即時囲い)
両方ともsprintfを'%'演算子で代用する方法です。この方法自体はGetText使って知りましたが、配列渡しは始めてみました。
ただ、文字列化する場合、やはり基本は"#{}"での埋め込みと思います。
書式化自体は便利なのでデバッグでは使いますが、性能に悪影響を与えるので、実行環境での多用はRuby以外の言語でも控えるようにしてます。
5 - Delete trees of files(ファイルツリーの削除)
ファイルツリーをFileUtils.rm_rで削除できるのは知りませんでした。
rm -rfと一緒のようなので、'/'を与えてしまったりすると大変なことになりそうです。
6 - Exploding enumerables(列挙型の展開)
前置'*'による配列の展開は知ってましたが、ハッシュの場合はキーと値ごとに配列化されるようです。
引数が多い場合に便利ですが、Rubyの場合はハッシュ渡しにした方が色々と楽なためか、引数が多くなることがあまりなく、使う機会はあまりありませんでした。C言語にあると助かる構文です。
7 - Cut down on local variable definitions(ローカル変数定義の削減)
'||='を活かして、未初期化の場合に空配列を代入してから、要素を追加する方法です。
これだけを見ると良いやり方と言えなくはないですが、複数の値を別々に代入する場合などを考えると、実際に使う場面はなさそうです。
8 - Using non-strings or symbols as hash keys(非文字列またはシンボルのハッシュキーとしての利用)
真偽値までハッシュのキーに使えるとは知りませんでした。
スクリプト上で分岐を書かないようなデータ取得が可能ですね。
9 - Use 'and' and 'or' to group operations for single liners(単行書きのための'and'と'or'での式集合の利用)
題名のままで、'and'と'or'を用いて式をつなげて1行で書く方法です。
簡単に書くときには使えそうですが、あまり可読性が良いとは言えないですね。
10 - Do something only if the code is being implicitly run, not required(実行された場合にのみ処理を実施)
実行ファイル名がソースファイル名と同一かを判定することで、直接実行された場合にのみ実行する処理を記述する方法です。
クラス単位の単体テストに有用と思います。
11 - Quick mass assignments(複数変数への即時代入)
複数のインスタンス変数への代入をinstance_variable_setを用いて実施する方法です。
Perlでも複数変数への代入はありますが、このようなメタプログラミングはRubyらしくて良いです。
単にメタプログラミングで複雑化しているだけに見えるかもしれませんが、代入箇所を変数名に依存しないで記述するという割と大きなメリットがあります。
12 - Use ranges instead of complex comparisons for numbers(複数の数値比較の代用としての範囲の利用)
case制御構文と範囲演算子を用いた、範囲振り分けの方法です。
これもRubyらしい方法で、C言語で言えばswitch制御構文でcaseに範囲指定ができるような書き方なので、C言語なら範囲判定で分岐させるためにfall throughか、if、else ifを利用するところを、より単純に可読性を高く書くことができますね。
13 - Use enumerations to cut down repetitive code(重複コード削減のための列挙の利用)
%wによる配列インスタンスの生成を利用して、個々の値に同様の処理を行う記述を複数回書くことを削減する方法です。
例はrequire文となっていますが、これはあまり有効には見えませんし、配列渡しを可能とした方が筋が通っているように思えます。
しかし、値を直接書くことが多い、自動テストやプロトタイピングには有効と思いますので、慣れておいて損はないかと思います。
あと、一応配列インスタンス自体は""で囲えば生成できますが、%wは引用符を打つ手間が省けるため、%wを使った方がより簡略化できます。
ただし、%wは可読性の面では良いとはいえませんので、余裕があれば""を使うべきでしょう。
14 - The Ternary Operator(三項演算子)
15 - Nested Ternary Operators(ネスト三項演算子)
C言語と同様、'?'と':'を用いた三項演算子の紹介です。
あまり推奨されていませんが、ネストしなければ可読性が高くなるケースは多いため、躊躇せず積極的に利用すべきと思います。
ただ、安易な利用を避けるために、8の真偽値をハッシュキーとして利用する方法、基本的なif-else文と、いずれが適切かを常に意識する必要はあります。
また、15ではネストされた三項演算子の評価順序についての話がありますが、これは可読性の観点からは推奨できません。確実に理解が難しくなります。
16 - Fight redundancy with Ruby's logical provisions(Ruby提供機能による余分な記述の削減)
Rubyで言語の機能として提供されるために余分となる記述を削減する方法です。
例として、比較して真偽値を返すメソッドの場合はif-elseや三項演算子を使う必要もなく、単に比較演算を書くだけで、真偽値を返すことができる処理が挙げられています。
Rubyが最後に評価した値を返すことはRubyのソースコードを見る限り半ば常識化しているようですし、可読性を損なうとは思えませんので、'?'付のメソッドを作成する場合には考慮した方が良いでしょう。
17 - See the whole of an exception's backtrace(例外バックトレースの一括確認)
文法ではなくException#backtraceを紹介しているのだと思います。
とりあえずの例外処理としては使えそうです。
ただ、Ruby1.9ではArray#to_sは#inspectの別名になるため、読むための文字列としては行儀が悪いとコメント欄で突っ込まれてますね。
18 - Allow both single items AND arrays to be enumerated against(単項と配列両方の列挙許容)
変数が単項か配列かに関わらず列挙として処理するための方法です。
Arrayクラスか確認する必要がなくなるので、地味ですが割と使えそうです。
19 - Rescue blocks don't need to be tied to a 'begin'('begin'を省略した例外捕捉)
beginを書かずにrescueのみを書く方法です。
単にbeginを省略できるというだけでなく、余分なネストが減るということもメリットです。
C++で言えば、tryを書かずにcatchを書いた場合に関数で発生した例外を捕捉できるようになるというところで、可読性も向上していると思います。
20 - Block comments()
'=begin'から'=end'を用いたブロックコメントです。
個人的には、コメントアウト範囲を正規表現にて'^'を'#'に置換する方がまだ良いですし、面倒ならエディタのマクロ機能に登録してしまえば充分と思いますし、可読性の観点から使いたくないです。
21 - Rescue to the rescue(rescueの救済)
rescueは1行で書けるということのようです。
知りませんでしたが、例外発生時の処理が特定の値を返すのみの場合はとても簡潔に記述できますね。
題名は洒落たつもりでは無いかと思います。面白いです。
おわりに
以上、個人的に意図を決め付けている部分もあるので、もし誤りなどありましたらご指摘いただければ幸いです。